目录
第一题-最长公共子串
思路:
本题使用动态规划, 当以前的问题等于上一个问题的答案加一,我们用start记录返回字符串的起始位置,用max_size记录返回字符串的长度
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string get_string(string& str1, string& str2)
{
//将较短的字符串给str1
if(str1.size() > str2.size())
{
swap(str1, str2);
}
int len1 = str1.size();
int len2 = str2.size();
//将二维数组初始化为0
vector<vector<int>>MSC(len1+1, vector<int>(len2+1, 0));
int start = 0, max_size = 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] > max_size)
{
max_size = MSC[i][j];
start = i - max_size;
}
}
}
return str1.substr(start, max_size);
}
int main ()
{
string str1,str2;
while(cin>>str1>>str2)
{
string ret = get_string(str1, str2);
cout<<ret<<endl;
}
return 0;
}
第二题-汽水瓶
思路:
循环计算汽水瓶消耗,同时计算喝了多少瓶汽水,注意的是如果最后汽水瓶最后剩两个,此时可以借一个汽水瓶,所以此时要多算一个汽水瓶。
#include<iostream>
using namespace std;
int main ()
{
int n;//最开始的空瓶子
int count = 0;//总共喝了多少瓶汽水
while(cin>>n)
{
while(n>=3)
{
n = n-3;
count++;
++n;
}
if(n == 2) count++;
cout<<count<<endl;
}
return 0;
}