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

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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值