目录
第二题-字符串翻转
第一题-公共子串计算
思路:
本题使用动态规划, 当以前的问题等于上一个问题的答案加一,我用max_size记录返回字符串的长度
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int get_string(string& str1, string& str2)
{
if(str1.size() > str2.size())
{
str1.swap(str2);
}
int len1 = str1.size();
int len2 = str2.size();
vector<vector<int>> MSC(len1+1, vector<int>(len2+1, 0));
int max_size = 0;
for(int i = 0; i < len1; ++i)
{
for(int j = 0; j < len2; ++j)
{
if(str1[i] == str2[j])
{
//从0开始,如果等于0,就给1,否则就给上一个的值加1
if(i >= 1 && j >= 1)
{
MSC[i][j] = MSC[i-1][j-1]+1;
}
else
{
MSC[i][j] = 1;
}
//实时更新max_size
if(max_size < MSC[i][j])
{
max_size = MSC[i][j];
}
}
}
}
return max_size;
}
int main ()
{
string str1,str2;
while(cin>>str1>>str2)
{
int ret = get_string(str1, str2);
cout<<ret<<endl;
}
return 0;
}
第二题-字符串翻转
思路:
双指针
#include<iostream>
using namespace std;
string get_string(string& str)
{
int begin = 0;
int end = str.size()-1;
while(begin < end)
{
swap(str[begin], str[end]);
++begin;
--end;
}
return str;
}
int main ()
{
string str;
while(cin>>str)
{
string ret = get_string(str);
cout<<ret<<endl;
}
return 0;
}