字符串包含子串數目
這裏主要對標的是 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];
}
後面刷題遇到相關方法,會不定期更新本文內容。