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

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);
}
}
}

时间: 2024-10-11 21:45:29

字典序,求给定字符串的下一个的相关文章

求给定字符串中最长回文子串

5. Longest Palindromic Substring 这个是在本机测试,然后一次点亮的,嘻嘻 1 char* longestPalindrome(char* s) { 2 char *p = s; /* first char */ 3 char *left, *right; /* store the pointer of longest palindrome string */ 4 int max = 0; /* store max length */ 5 while(*p != '

LinkCode 下一个排列、上一个排列

http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列. 如果没有下一个排列,则输出字典序最小的序列. 样例 左边是原始排列,右边是对应的下一个排列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路(示例:[1,3,5,4,2]) 从后开始往前遍历,找到后一个元素大于前一个元素的时候记录前一个元素的指针(也

27.Next Permutation(下一个字典序列)

Level: ??Medium 题目描述: Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending

剑指offer(python)------二叉树的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 这道题意即:给定一个节点,按照中序遍历(左根右)的方式求该节点的下一个节点.有三种情况:1. 给定的节点为空——返回空:例如:A2. 给定的节点有右子树——沿着该右子树,返回右子树的第一个左叶子节点:例如:E节点的下一个节点是M3. 给定的节点没有右子树——如果位于某个节点的左子树中,则上溯直至找到该节点:否则就返回空.[因为按照中序遍历“左中右”的遍

stl 之 next_permutation 求出一个排序的下一个排列的函数 转载

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>下面是以前的笔记    与之完全相反的函数还有prev_permutation  (1) int 类型的next_permutation int main(){ int a[3];a[0]=1;a[1]=2;a[2]=3; do{cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<

已知一个排列求下一个排列(NOIP2004P4 火星人 题解)转

题目描述略) 本题题意为求给定长度为 n 的数列的后第 m 个全排列(字典序). 对于一个给定的数列 a[0 .. n-1],求其下一个字典序的全排列算法如下: 从右向左查询最大的下标 i (0 ≤ i ≤ n-1) 使得 a[i] < a[i+1]: 从左向右查询最小的元素 a[j] (i+1 ≤ j ≤ n-1) 使得 a[i] < a[j]: 交换 a[i] 和 a[j]: 逆置翻转 a[i+1 .. n-1]. 算法分析:我们可以发现,第一步求出的 i 下标表示 a[i+1 .. n-

ID Codes UVA 146(求字典序比当前字符串小的最大字符串)

说说: 题意其实很简单,就是给你一个由小写英文字母组成的字符串,然后让你求字典序比当前字符串小的最大的字符串.解法的话,就是从字符串的末尾开始遍历,若得到的子串已经是该字串所能得到的最小字典序,则继续往前遍历.否则,先在子串中,找到比原字串的首字符小的最大字符,将两者交换位置.然后将除首字符以外的其他字串排列获取最大字典序的子串即可.具体方案,看源代码好了. 源代码: #include <stdio.h> #include <string.h> #define MAX 50+5 c

SQL Server获取下一个编码字符串的实现方案分割和进位

我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方案的,后一种方案虽然解决了其中方案的缺点,但是依然存在的编码字符串长度的限制(最多满足8位长度),本博文提供的方案将编码字符串长度增加到19位,也可以足够项目中实现这些编码. 具体的编码规则可以参看以上两种解决方案博文中的描述,也可以进入SQL Server 大V潇湘隐者的获取下一个编码字符串问题这篇博文.

2.1.12 Next Permutation 下一个字典序数组

对当前排列从后向前扫描,找到一对为升序的相邻元素,记为i和j(i < j).如果不存在这样一对为升序的相邻元素,则所有排列均已找到,算法结束:否则,重新对当前排列从后向前扫描,找到第一个大于i的元素k,交换i和k,然后对从j开始到结束的子序列反转,则此时得到的新排列就为下一个字典序排列.这种方式实现得到的所有排列是按字典序有序的,这也是C++ STL算法next_permutation的思想.