给定字符串s[len],求下一个回文字符串
例如
123 =》 131
321 =》 323
121 =》 131
191 =》 202
999 =》 1001
也就是从i=0到(len-1)/2扫描,
- 如果a[j=len-1-i]不等于a[i],则令a[j]=a[i],如果a[j]变大,说明当前串变大。否则,当前串变小。
扫描到头检查当前串是变大还是变小还是没变。
- 如果变大,则直接返回。
- 否则,令a[i=(len-1)/2]和a[j=len-1-i]自增。如果增加后溢出,则置为0,向外(从中間向两边)进位。
- 需要注意,当进位进到超过a[0]时,说明当前串长度需要变化(+1),并变成100....01的形式。
/* * Complete the function below. */ #include <iostream> using namespace std; string getNextSymmetricNumber(string n) { int len=n.length(); bool bigger=false; for(int i=0;i<=(len-1)/2;i++){ int j=len-i-1; if(n[i]!=n[j]) { if(n[i]<n[j]){ n[j]=n[i]; bigger=false; } else{ n[j]=n[i]; bigger=true; } } } if(bigger) return n; for(int i=(len-1)/2;i>=0;i--){ n[i]=++n[len-1-i]; if(n[i]>'9'){ n[i]=n[len-1-i]='0'; } else break; } if(n[0]=='0'){//最高位发生进位 string t="1"; for(int i=0;i<len-1;i++) t+='0'; t+='1'; return t; } return n; } int main(){ string s;//="130"; cin>>s; cout<<getNextSymmetricNumber(s)<<endl; return 0; }