寻找相同子串
题目描述
给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
变换规则:交换字符串中任意两个不同位置的字符。
输入描述
一串小写字母组成的字符串s
输出描述
按照要求进行变换得到的最小字符串。
- s是都是小写字符组成
- 1 ≤ s.length ≤ 1000
输入 | abcdef |
输出 | abcdef |
说明 | abcdef已经是最小字符串,不需要交换。 |
输入 | bcdefa |
输出 | acdefb |
说明 | a和b进行位置交换,可以得到最小字符串 |
源码和解析
解析:
先排序,找出排序后顺序交换位置距离最远的那个进行交换即可
示例代码:
import java.util.Arrays;
import java.util.Scanner;
/**
* 一次变换要想得到最小 那么交换时,肯定是将最小的字符往前提 如果那个最小字符有多个,则肯定是提取最后一个
* 比如 bacada===> aacadb=> 最后一个a和首字符交换
* 解决思路 先排序 查找从前往后字符串变化的地方
*/
public class T41 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String rawWord=sc.nextLine();
char[] cArr=rawWord.toCharArray();
Arrays.sort(cArr);
boolean flag=false;
for(int i=0;i<cArr.length;i++) {
if(cArr[i]!=rawWord.charAt(i)) {
char obj=cArr[i];//要替换的目标字符
int lastIndex=rawWord.lastIndexOf(obj); //要替换的目标字符 最后的索引
StringBuilder sb=new StringBuilder(rawWord);
char rawObj=sb.charAt(i);//目标字符提前的索引对应字符 目标字符要和谁换
sb.setCharAt(i, obj);
sb.setCharAt(lastIndex, rawObj);
System.out.println(sb.toString());
flag=true;
break;
}
}
if(flag==false){
System.out.println(rawWord);
}
}
}
代码运行示意图: