字符串相关功能函数(C++)

文章目录

        • 字符串包含子串数目
        • 字符串的最小编辑距离
        • 字符串数组的最小编辑距离

字符串包含子串数目

这里主要对标的是 Python 程序中字符串对应的 count 函数,C++中 algorithm.hpp 头文件中也有 count(),但是只能计算单个字符在字符串中出现的次数,而在 Python 中:

s="111231123"
sub="11"
print(s.count(sub))

输出会是:

2

这里用 C++ 编写对应的函数来计算:

int subCount(string s,string sub)
{
	int cnt = 0;
	while (s.find(sub) != string::npos)
	{
		int index = s.find(sub);
		cnt++;
		s = s.substr(index + sub.length(), s.length());  // 非重叠:  111 中找 11 是 1 个
		//s = s.substr(index + 1, s.length());  //  重叠版:  111 中找 11 是 2 个
	}
	return cnt;
}

注意这里 find 查找失败会返回一个 string::npos

字符串的最小编辑距离

这里具体问题就是对 A,B 两个字符串,可以经过:

  • 删除一个字符
  • 插入一个字符
  • 将一个字符改为另一个字符
    三种操作,问从 A 到 B 最少的字符操作是多少次,也称为编辑距离问题。这个问题目前来看是有固定的 递推式 的。
dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + (s1[i-1] == s2[j-1] ? 0 : 1));

下面直接上代码,主要需要注意的点是,初始矩阵的大小,都是 Len+1,并且 for 循环起始位置都为 1 结束位置都为 len。

int min_dis(string s1, string s2)
{
	int len1 = s1.length();
	int len2 = s2.length();
	vector> dp(len1+1, vector(len2+1, 0));
	for (int i = 1; i <= len1; i++)
	{
		dp[0][i] = i;
	}
	for (int i = 1; i <= len2; i++)
	{
		dp[i][0] = i;
	}
	for (int i = 1; i <= len1; i++)
		for (int j = 1; j <= len2; j++)
			dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + (s1[i-1] == s2[j-1] ? 0 : 1));

	return dp[len1][len2];
}

字符串数组的最小编辑距离

这个问题起始跟字符串数组是一模一样的,区别是每一次删除,插入,替换的都是以字符串为单位的。

int min_dis(vector s1, vector s2)
{
   int len1 = s1.size();
   int len2 = s2.size();
   vector> dp(len1+1, vector(len2+1, 0));
   for (int i = 1; i <= len1; i++)
   {
   	dp[0][i] = i;
   }
   for (int i = 1; i <= len2; i++)
   {
   	dp[i][0] = i;
   }
   for (int i = 1; i <= len1; i++)
   	for (int j = 1; j <= len2; j++)
   		dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + (s1[i-1] == s2[j-1] ? 0 : 1));
   		
   return dp[len1][len2];
}

后面刷题遇到相关方法,会不定期更新本文内容。

你可能感兴趣的:(C++)