原题链接:http://codeforces.com/problemset/problem/1281/B
题目大意: 给你两个字符串 s 和 c ,最多经过一次变换,使s的字典序小于c,输出变换后的s ,如果不成立输出---
思路: 直接对s进行遍历,找到经过一次变换后字典序最小的s。 要找字典序最小的s,变换时就要将位置靠后的,字典序小的换到前面。
ABACA AABBC
代码
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define inf 0x3f3f3f3f using namespace std; string s,c,kk; int main () { int n,m,i,t,sum,j,k,f=0; cin>>n; while(n--) { cin>>s>>c; k=s.length(); f=0; for(i=0;i<k-1;++i){ int jj=i; for(t=k-1;t>=jj+1;--t) { if(s[i]>s[t]) i=t,j=t,f=1; ///从后往前遍历,如果当前字符小的话就记录下来, } if(f){ swap(s[jj],s[j]); ///jj是记录的第一层循环的 i ,j是找到的靠后的最小的字符 break; } } //cout<<s<<endl; if(s<c) cout<<s<<endl; else cout<<"---"<<endl; } return 0; }