【牛客 - 330I】Applese 的回文串(结论题,类似编辑距离,dp)
題干:
?
自從 Applese 學(xué)會了字符串之后,精通各種字符串算法,比如……判斷一個字符串是不是回文串。
這樣的題目未免讓它覺得太無聊,于是它想到了一個新的問題。
如何判斷一個字符串在任意位置(包括最前面和最后面)插入一個字符后能不能構(gòu)成一個回文串?
輸入描述:
僅一行,為一個由字母和數(shù)字組成的字符串 s。輸出描述:
如果在插入一個字符之后可以構(gòu)成回文串,則輸出"Yes", 否則輸出"No"。示例1
輸入
復(fù)制
applese輸出
復(fù)制
No示例2
輸入
復(fù)制
java輸出
復(fù)制
Yes備注:
|s|≤105題目大意:
? 一句話題意:給定一個字符串,問是否能通過添加一個字母將其變?yōu)榛匚拇?/p>
解題報告:
可以認(rèn)為插入和刪除是等價的操作。想到這一點,這題就會好做很多。
如果這個串本身就是回文串,答案一定是Yes。(因為如果原來是奇數(shù)個字符,那直接加一個中間的字符就行了;如果原來是偶數(shù)個字符,在中間隨便加一個字符依舊是回文串。)
否則我們只需要找到串中對稱的位置第一對 不相等的兩個字符,分別嘗試把它們刪掉后判斷一下是不是回文的就行了。
時間復(fù)雜度O(n)。還有中n^2的做法就是枚舉每一個刪除的位置看刪除之后剩下的字符串是否是回文串,但是效率就太低了。。
AC代碼:(O(n)的解法)
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; bool ok(string s) {string s2=s;reverse(s2.begin(),s2.end());return s==s2; } string str; int main() {bool flag = 0;cin>>str;int len = str.size(),i;for(i = 0; i<len/2;i++) {if(str[i] != str[len-1-i]) break;}if(i == len/2) flag = 1;if(ok(str.substr(i+1,len-2*i-1))) flag = 1;if(ok(str.substr(i,len-2*i-1))) flag = 1;if(flag) puts("Yes");else puts("No"); return 0; }TLE代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; bool ok(string s) {string s2=s;reverse(s2.begin(),s2.end());return s==s2; } string str; int main() { cin>>str;bool flag=0;int len = str.size();for(int i=0;i<len;++i){if(ok(str.substr(0,i)+str.substr(i+1,len-1-i))){flag=1;break;}}if(flag) puts("Yes");else puts("No");return 0; }一段有待考察的代碼:
//#include<cstdio> //#include<iostream> //#include<algorithm> //#include<queue> //#include<map> //#include<vector> //#include<set> //#include<string> //#include<cmath> //#include<cstring> //#define ll long long //#define pb push_back //#define pm make_pair //#define fi first //#define se second //using namespace std; //const int MAX = 2e5 + 5; //char s1[MAX],s2[MAX],s3[MAX],s4[MAX],c2[MAX],ch; //int main() //{ // cin>>s1; // int len = strlen(s1); // strcpy(s2,s1); // reverse(s2,s2+len); // strcpy(c2,s2); // for(int i = 0; i<len; i++) { // if(s1[i] == s2[i]) continue; // ch = s1[i]; // for(int j = len; j>=i+1; j--) c2[j] = c2[j-1]; // c2[i] = ch; // break; // } // strcpy(s3,c2); // strcpy(s4,s3); // reverse(s4,s4+strlen(s3)); // if(strcmp(s3,s4) == 0) puts("Yes"); // else puts("No"); // return 0 ; // }擴(kuò)展一個思路:給定一個字符串,問添加幾個字符可以構(gòu)成回文串?
? 先把原字符串逆序,然后計算兩字符串的最長公共子序列長度,最后diff=字符串長度-最長公共子序列長度,diff即為如果可以形成回文串,原字符串需要添加的字符個數(shù)。用到這個題目里,如果diff<=1,即可。時間復(fù)雜度O(n^2)。
總結(jié)
以上是生活随笔為你收集整理的【牛客 - 330I】Applese 的回文串(结论题,类似编辑距离,dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winhelp.exe - winhel
- 下一篇: 【LightOJ - 1104】Birt