字典序,求给定字符串的下一个

POJ 1146 ID Codes 

给定字符串有26个小写字母组成,求出给定字符串的下一个。

算法简述:

对于字符数组chararray,从字符串末尾向前找到第一个chararray[index]<chararray[index-1],然后找到index之后的字符中最后一个大于chararray[index-1],记为position,小于chararray[index]的字符。然后交换chararray[index-1]和chararray[position]。对index及其以后的字符从小到大排序即可。

代码:

import java.util.Scanner;

public class Main {

public static void next(String str)
{
char[] chararray = str.toCharArray();
int length=str.length();
int count=length-1,i=0;
while(count>0)
{
if(chararray[count]>chararray[count-1])
{
break;
}
count--;
}
if(count==0)
{
System.out.println("No Successor");
return;
}
int midindex=count;
int leftindex=count;
for(i=midindex;i<length;i++)
{
if((chararray[i]>chararray[midindex-1])&&(chararray[i]<chararray[midindex]))
{
leftindex=i;
}
}
char node = chararray[leftindex];
chararray[leftindex]=chararray[midindex-1];
chararray[midindex-1]=node;
int minindex=0;
for(i=count;i<length-1;i++)
{
minindex=i;
for(int j=i+1;j<length;j++)
{
if(chararray[j]<chararray[minindex])
{
minindex=j;
}
}
if(minindex!=i)
{
node = chararray[minindex];
chararray[minindex]=chararray[i];
chararray[i]=node;
}
}
str = new String(chararray);
System.out.println(str);
}
public static void main(String[] arg0)
{
@SuppressWarnings("resource")
Scanner sc1 = new Scanner(System.in);
while(true)
{
String str = sc1.nextLine();
if(str!=null&&str.equalsIgnoreCase("#"))
{
break;
}
next(str);
}
}
}

原文地址:https://www.cnblogs.com/earendil/p/4194375.html