这题真是做得我心态爆炸!
题意:
给你一个字符串,让你从第一个字符开始,将以它为开头的长度为 k 的子串翻转,这样的子串与剩下的串构成新串,接着从第二个字符开始直到第 n-k 个,找出这样构成的新串中字典序最小的,如有多个,k要最小的。
这题可以通过简单的找规律发现:
当n-k+1为奇数时,新串前一部分是原串前k个字符;为偶数时,前一部分是前k个字符翻转
所以暴力比较所有新串,找出最小的即可。
在解决本题之前,先介绍两个函数:
子串截取函数 substr()
头文件#include<string>
string s1,s2;
s1=s2.substr(i,k);//以为s1为s2从i位置开始,截取的长度为k的串,k不写默认到结尾
reverse()函数
头文件#include<algorithm>
string s;
reverse(s.begin(),s.end());//将s反转
这两个函数让我初识了string类。。。
string可以让字符串直接比较大小,相加,复制,非常方便
AC代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
string s;
cin>>n>>s;
string ans=s;
int pos=1;
for(int i=0;i<n;i++)
{
string s1=s.substr(0,i);
string s2=s.substr(i);
if((n-i+1)%2==0)
reverse(s1.begin(),s1.end());
string temp=s2+s1;
if(temp<ans)
{
ans=temp;
pos=i+1;
}
}
cout<<ans<<endl<<pos<<endl;
}
return 0;
}
感觉这次的博客写的不太好,不过主要还是为了通过这题总结string相关的函数