String Modification题解报告
标签: 字符串 找规律 模拟
题意:
给定一个长度为n(1≤n≤5000 )的字符串,从头开始遍历,对每个k长度子序列翻转一下,求字典序最小的那个以及k的值,如果有多个字典序最小,要求k最小。
解题思路
首先通过模拟找出规律
设置字符串12345;
k=1 12345
k=2 2345 1
k=3 345 21
k=4 45 123
k=5 5 4321
可以发现 若我们将字符串分成前序列和后序列,翻转后的序列将是前后两个序列互换位置,而原本的前序列根据目前的例子来看是跟着k的奇偶而决定是否翻转,另外可以确定前序列的长度为k-1。
设置字符串 123456
k=3 3456 12
k=4 456 321
再由这两个例子我们可以发现: 前序列是否翻转由k和字符串长度n的差或者和相关。
代码实现
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string s,ans;
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cin>>s;
ans=s;
int k=1;
for(int i=2;i<=n;i++){
string s1,s2,s3;
s1=s.substr(0,i-1);
s2=s.substr(i-1);//从i-1的位置往后取完为止
if((n-i)%2==0) reverse(s1.begin(),s1.end());
s3=s2+s1;
if(s3<ans){
k=i;
ans=s3;
}
}
cout<<ans<<endl;
cout<<k<<endl;
}
}