String Modification题解报告

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;
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值