UVA-146
题意:给出一个字符串,求它按字典序的下一个串。
解题思路:从后往前找到第一个不满足s[i] >= s[i+1]的位置,用i+1到end中比s[i]大的中最小的那个替换s[i],剩下的i+1到end的字母从小到大排序。
/*************************************************************************
> File Name: UVA-146.cpp
> Author: Narsh
>
> Created Time: 2016年07月26日 星期二 15时33分08秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
bool cmp(char a,char b) {
return a<b;
}
string s;
int main() {
while (true) {
cin>>s;
if (s[0] == '#') break;
int l=s.length(),end;
end=l;
s=" "+s;
while ( l > 1 && s[l] <= s[l-1]) l--;
if (l <= 1) {
printf("No Successor\n");
continue;
}
for (int i = end; i >= l; i--)
if (s[i] > s[l-1]) {
char k=s[i];
s[i]=s[l-1];
s[l-1]=k;
break;
}
sort(&s[0]+l,&s[0]+1+end,cmp);
for (int i = 1; i <= end; i++)
printf("%c",s[i]);
printf("\n");
}
}