给定一个字符串str和str的最长回文子序列strLPS,返回字符串str在任意位置添加最少字符后,整体都是回文串的其中一种结果。
例如:
str = “B1G2TY34I3OPX2S1”;
strLPS = “123I321”;
返回:B1GS2TYXPO34I43OPXYT2SG1B
注意:也可以返回B1SG2XPOTY34I43YTOPX2GS1B,总之返回一种满足条件的结果即可。
- 思路
这是一个剥洋葱的过程,字符串m个字符,子串n个字符,则新串工为2*(m-n)+n=2m-n
在str左右同时找strLPS的每个字母,找到相同的记录下来,添加不同的值
比如左1左边是B右1右边是空,故新字符串左右添加B,即B1…1B
比如左2左边是GS右1右边是空,故新字符串左右添加GS,即B1GS2…2SG1B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <stdio.h> #include <string.h> char str[10000]; char lps[10000]; int main() { freopen("in.txt","r",stdin); while(scanf("%s %s",str,lps)!=EOF){ int len=2*strlen(str)-strlen(lps); char res[len]; int i=0,j=0,k=strlen(str)-1,cnt=0; while(j<=k){ while(str[j]!=lps[i]){ res[cnt++]=str[j]; j++; } while(str[k]!=lps[i]){ res[cnt++]=str[k]; k--; } res[cnt++]=lps[i++]; j++;k--; } cnt--; for(int i=cnt;i<len;i++){ res[i]=res[--cnt]; } printf("%s\n",res); } }
|