字符串包含子串数目
这里主要对标的是 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<vector<int>> dp(len1+1, vector<int>(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<string> s1, vector<string> s2)
{
int len1 = s1.size();
int len2 = s2.size();
vector<vector<int>> dp(len1+1, vector<int>(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];
}
后面刷题遇到相关方法,会不定期更新本文内容。

被折叠的 条评论
为什么被折叠?



