给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。 变换规则:交换字符串中任意两个不同位置的字符。
输入描述:
一串小写字母组成的字符串s
输出描述:
按照要求进行变换得到的最小字符串
示例
输入:abcdef
输出:abcdef
说明:abcdef已经是最小字符串,不需要交换
输入:bcdefa
输出:acdefb
说明:a和b进行位置交换,可以得到最小字符串
备注:
s是都是小写字符组成
1<=s.length<=1000
方案一:(暴力解决)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
scanner.close();
char[] charArray = string.toCharArray();
int n = charArray.length;
//判断最小字母是否位于字符串的头部
boolean headIsSmallest = true;
//需要交换的头部字符位置
int index = 0;
//需要交换的后面的字符的位置
int firstIndex = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (!headIsSmallest){
firstIndex = charArray[firstIndex] >= charArray[j] ? j : firstIndex;
}
if (charArray[i] > charArray[j]) {
headIsSmallest = false;
index = i;
firstIndex = j;
}
}
if (!headIsSmallest){
break;
}
}
if (headIsSmallest) {
System.out.println(new String(charArray));
}else {
char tmp = charArray[index];
charArray[index] = charArray[firstIndex];
charArray[firstIndex] = tmp;
}
System.out.println(new String(charArray));
}
}
方案二:(递归解决)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String inputString = in.next();
char[] chars = inputString.toCharArray();
moveTheSmallest2Head(chars, 0);
System.out.println(new String(chars));
}
private static void moveTheSmallest2Head(char[] chars, int start) {
if (start == chars.length - 1) {
return;
}
boolean headIsSmallest = true;
char smallest = chars[start];
int samallestIndex = start;
for (int i = start + 1; i < chars.length; i++) {
if (chars[i] < chars[start] && chars[i] <= smallest) {
headIsSmallest = false;
smallest = chars[i];
samallestIndex = i;
}
}
if (headIsSmallest) {
moveTheSmallest2Head(chars, start + 1);
} else {
char temp = chars[start];
chars[start] = chars[samallestIndex];
chars[samallestIndex] = temp;
}
}
}