点击跳转题目链接
写题解是为了记录自己的成长和思考该题的方式,同时锻炼自己的能力,注释我会详细写出自己哪里纠结了很久的地方,以及相关的一些知识点,有错误还请各位大佬指出。
本题关键:高度限制3h,要对应缝隙,用相加<3解决,有顺序限制,需要来回讨论。
方法:找出大小串,以大的在上,小的从左蹭到右,之后顺序同时反转再蹭一遍。
这是我做题时画的一个简单流程图:
以下是AC代码:
下面展示一些 内联代码片
。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int minl(string mins, string maxs)
{
int l1=maxs.size(), l2=mins.size();//一开始我用strlen然后报错了,只能用于char型,string型要用size
int i=0,j=0;
for(i=0; i<l1; i++)
{
for(j=0; j<min(l2, l1-i); j++)//用min(l2,l1-i)避免超出内存
{
if(mins[j] + maxs[j+i] - 96 > 3) break;//这里一开始我用mins[j]+maxs[j+i]>'3'表示,后来实在吐血了想到可能字符串直接相加不能表示成ASCII比较大小,查了资料后发现可以这样表示
}
if(j == min(l2, l1-i)) break;
}
int l;
l2 + i < l1 ? l=l1 : l=l2+i;//判断是否超出最大字符串的边界再确定长度
return l;
}
int main(int argc, char** argv) {
string s1,s2,mins,maxs;
while(cin>>s1>>s2)
{
if(s1.size() <= s2.size()) mins=s1, maxs=s2;
else mins=s2, maxs=s1;
int a1=minl(mins, maxs);
//两边都要同时反转,具体原因可思考一下
reverse(maxs.begin(), maxs.end());//reverse函数将字符串顺序反转,头文件是algorithm
reverse(mins.begin(), mins.end());
int a2=minl(mins, maxs);
cout<<min(a1, a2)<<endl;
}
return 0;
}