每个数字字符串可以选择全部加一,超过9的变0.然后求出最小字符串。
之前了解过最小字符串,可无奈还是忘了,不会写,所以又查了一下最小字符串的方法。
转载一下别人的博客,写的比较详细,建议模拟一遍,再看一下证明,应该就懂了。多做几道题巩固一下最小字符串的表示方法吧。
http://blog.csdn.net/zy691357966/article/details/39854359
我的AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void add(char *str,int len)
{
for(int i=0;i<len;i++)
if(str[i]=='9')
str[i]='0';
else
str[i]+=1;
}
int getministr(char *str,int l)
{
int i,j,k;
i=0;j=1;
k=0;
while(i<l&&j<l)
{
k=0;
while(str[i+k]==str[j+k]&&k<l)k++;
if(k==l)return i;
if(str[i+k]>str[j+k])
if(i+k+1>j) i=i+k+1;
else i=j+1;
else
if(j+k+1>i) j=j+k+1;
else j=i+1;
}
if(i<l) return i;
return j;
}
int main()
{
char str[2200];
char str2[1100];
int n;
while(cin>>n)
{
cin.get();
scanf("%s",str);
int pos;
for(int i=0;i<=n;i++)
str[i+n]=str[i];
str[n*2]=0;
pos=getministr(str,n);
for(int i=0;i<n;i++)
str2[i]=str[i+pos];
str2[n]=0;
int j;
bool flag=false;
for(int i=0;i<10;i++)
{
add(str,2*n);
pos=getministr(str,n);
flag=false;
for(j=0;j<n&&(!flag);j++)
{
if(str2[j]>str[j+pos])
flag=true;
if(str2[j]<str[j+pos])
break;
}
if(flag)
for(j=pos;j<pos+n;j++)
str2[j-pos]=str[j];
}
cout<<str2<<endl;
}
}