【问题描述】
给定一个字符串,你必须通过交换两个不同位置的字母来得到一个新的字符串(两个字母可能是相同的)。比如,对于字符串"aba"通过以上规则能够得到字符串"baa", "aab", 或"aba"。你需要从中选择一个“最小”的字符串(按照字母顺序),此处应是"aab"。
题目中给定2个字符串数组s1和s2。将s1和s2所有的元素串联起来得到原始字符串。需要返回一个包含2个元素的整数数组,其中标识了在原始字符串中待替换的2个字符的索引(以0开始)。如果存在多种结果,那么返回索引值最小的结果。
定义:
类 LetterInterchange
方法 public int[] interchangeWhich(String[] s1, String[] s2)
约束:
1、s1和s2均包含1至50个元素
2、每个元素均包含1至50个字母(a-z)
测试用例:
1、{"a", "b", "a"} {"c", "a", "b", "a"} Returns: {1, 6 }
2、{"aa"} {"bb"} Returns: {0, 1 }
3、{"a"} {"b", "c"} Returns: {1, 2 }
4、{"aa"} {"b", "bcc"} Returns: {0, 1 }
【算法思想】
本题主要分成三种情况:
1、如测试用例1,字符串为"abacaba",字符b可以和其后的3个a进行交换,结果都会使得到的串比较小,但是得到的3个串中只有b和最后一个a进行交换的时候最终结果最小。因此这种情况的时候,对于当前字符,需要和最后一个大于该字符的字符交换。
2、如测试用例2,字符串中的字符是有序递增的(可能有相同字符)。这种情况就需要找到2个相同的字符交换即可。
3、如测试用例3,字符串中的字符是严格递增的(没有相同的字符)。这种情况就需要交换最后2个字符即可。
给定一个字符串,你必须通过交换两个不同位置的字母来得到一个新的字符串(两个字母可能是相同的)。比如,对于字符串"aba"通过以上规则能够得到字符串"baa", "aab", 或"aba"。你需要从中选择一个“最小”的字符串(按照字母顺序),此处应是"aab"。
题目中给定2个字符串数组s1和s2。将s1和s2所有的元素串联起来得到原始字符串。需要返回一个包含2个元素的整数数组,其中标识了在原始字符串中待替换的2个字符的索引(以0开始)。如果存在多种结果,那么返回索引值最小的结果。
定义:
类 LetterInterchange
方法 public int[] interchangeWhich(String[] s1, String[] s2)
约束:
1、s1和s2均包含1至50个元素
2、每个元素均包含1至50个字母(a-z)
测试用例:
1、{"a", "b", "a"} {"c", "a", "b", "a"} Returns: {1, 6 }
2、{"aa"} {"bb"} Returns: {0, 1 }
3、{"a"} {"b", "c"} Returns: {1, 2 }
4、{"aa"} {"b", "bcc"} Returns: {0, 1 }
- public class LetterInterchange {
- public int[] interchangeWhich(String[] s1, String[] s2) {
- int[] res = new int[2];
- StringBuilder sb = new StringBuilder();
- for (String string : s1) {
- sb.append(string);
- }
- for (String string : s2) {
- sb.append(string);
- }
- String src = sb.toString();
- char c1, c2;
- for (int i = 0; i < src.length(); i++) {
- c1 = src.charAt(i);
- res[0] = i;
- for (int k = src.length() - 1; k > i; k--) {
- c2 = src.charAt(k);
- if (c1 > c2) {
- res[1] = k;
- return res;
- }
- }
- }
- for (int i = 0; i < src.length(); i++) {
- c1 = src.charAt(i);
- res[0] = i;
- for (int k = i + 1; k < src.length(); k++) {
- c2 = src.charAt(k);
- if (c1 == c2) {
- res[1] = k;
- return res;
- }
- }
- }
- if(res[1]==0){
- res[0]=src.length()-2;
- res[1]=src.length()-1;
- }
- return res;
- }
- }
本题主要分成三种情况:
1、如测试用例1,字符串为"abacaba",字符b可以和其后的3个a进行交换,结果都会使得到的串比较小,但是得到的3个串中只有b和最后一个a进行交换的时候最终结果最小。因此这种情况的时候,对于当前字符,需要和最后一个大于该字符的字符交换。
2、如测试用例2,字符串中的字符是有序递增的(可能有相同字符)。这种情况就需要找到2个相同的字符交换即可。
3、如测试用例3,字符串中的字符是严格递增的(没有相同的字符)。这种情况就需要交换最后2个字符即可。