(19、20)/48(6_7) 编程

本文包含四个编程问题的解决方案:1)计算汽水瓶的某种计算方法;2)使用动态规划找到两个字符串的最长公共子串;3)利用双指针技术反转字符串;4)计算字符串的最大公共子串长度。这些示例主要涉及字符串操作和动态规划算法。
摘要由CSDN通过智能技术生成

1、汽水瓶

//观察数据,取巧法
int CalcNuMber_1(int n)
{
	return n / 2;
}

//概念法
int CalcNumber(int n)
{
	int sum = 0;
	while (n > 1)
	{
		int res = n / 3;
		int left = n % 3;
		sum += res;
		n = left + res;
		if (n == 2)
		{
			sum++;
			break;
		}
	}
	return sum;
}

int main()
{
	int n;
	while (cin >> n)
	{
		if (n == 0)
			break;
		int res = CalcNuMber_1(n);
		cout << res << endl;
	}
	return 0;
}

2、查找两个字符串a,b中的最长公共子串(动态规划)

string GetComSubstr(string &str1, string &str2)
{
	if (str1.size()>str2.size())
		swap(str1, str2);

	int len1 = str1.size();
	int len2 = str2.size();

	vector<vector<int>> MSC(len1 + 1, vector<int>(len2 + 1, 0));
	int start = 0, Maxsize = 0;
	for (int i = 1; i <= len1; ++i)
	{
		for (int j = 1; j <= len2; ++j)
		{
			if (str1[i - 1] == str2[j - 1])
				MSC[i][j] = MSC[i - 1][j - 1] + 1;
			if (MSC[i][j]>Maxsize)
			{
				Maxsize = MSC[i][j];
				start = i - Maxsize;
			}
		}
	}
	return str1.substr(start, Maxsize);
}

int main()
{
	string str1, str2;
	while (cin >> str1 >> str2)
	{
		string substr = GetComSubstr(str1, str2);
		cout << substr << endl;
	}
	return 0;
}

3、字符串反转(双指针)

void StrReverse(string &str)
{
	int start = 0;
	int end = str.size() - 1;
	while (start<end)
	{
		int tmp = str[start];
		str[start] = str[end];
		str[end] = tmp;
		start++;
		end--;
	}
}

int main()
{
	string str;
	while (getline(cin, str))
	{
		StrReverse(str);
		cout << str << endl;
	}
	return 0;
}

4、公共子串计算(DP)

int GetMaxComSubstr(string str1, string str2)
{
	int Max_len;
	int len1 = str1.size();
	int len2 = str2.size();
	int max_len = 0;

	vector<vector<int>> MAC(len1 + 1, vector<int>(len2 + 1, 0));


	for (int i = 1; i <= len1; ++i)
	{
		for (int j = 1; j<=len2; ++j)
		{
			if (str1[i - 1] == str2[j - 1])
				MAC[i][j] = MAC[i - 1][j - 1] + 1;
			if (max_len<MAC[i][j])
			{
				max_len = MAC[i][j];
			}
		}
	}
	return max_len;
}

int main()
{
	string str1, str2;
	while (cin >> str1 >> str2)
	{
		int Max_len = GetMaxComSubstr(str1, str2);
		cout << Max_len << endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值