字符串相關功能函數(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<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];
}

後面刷題遇到相關方法,會不定期更新本文內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章