参加了一个笔试,心情比较复杂难过,但是代码还是可以记录下的,毕竟是我自己写出来的。
题目的大概描述:
字符串s的最大字典序子串;子串为不改变字符串排列先后顺序,如abcdef,cef是子串,cba不是子串。
补充:字典序为两个字符串,abcdef,bcd从第一个字符开始比较,第一个字符不相等,a < b,所以第一个字典序较小。若第一个相等,继续比较后续字符比如hi,history,若其中一个没有后续的字符了,则较短的串,字典序较小。
PS:我恨字典序。
***
* @Title: MaxDictionaryOrder
* @Description: 求字符串s的最大字典序子串;子串定义为不改变字符串排列先后顺序,如abcdef,cef是子串,cba不是子串;
* 字典序为两个字符串,abcdef,bcd从第一个字符开始比较,第一个字符不相等,a < b,所以第一个字典序较小。
* 若第一个相等,继续比较后续字符比如hi,history,若其中一个没有后续的字符了,则较短的串,字典序较小。
* @Author: FuTongxue
* @Version: 1.0.0
* @Time: 2022/4/10 20:41
**/
public class MaxDictionaryOrder {
public String maxDictionaryOrder(String s) {
String result = null;
StringBuilder resultBuilder = new StringBuilder();
if (s == null || s == "") {
return result;
}
char[] arr = s.toCharArray();
int maxIndex = 0;
//一次for循环找到当前最大的char,循环一次则子串要从当前最大串往后找
//如abcacacabaaaba,一次循环c最大,下标为2,则第二次循环从c后开始,下标为3,找到最大值c,下标为4
for (int i = maxIndex; i < arr.length; i++) {
//最大值初始化为子串首字母
char max = arr[i];
//下次for循环从最大char往后找
//每次循环完了要把最大值的index往后挪
maxIndex = i;
for (int j = i; j < arr.length; j++) {
if (arr[j] > max) {
max = arr[j];
maxIndex = j;
}
}
//要修改i的值,即改变外层循环
i = maxIndex;
resultBuilder.append(max);
}
result = resultBuilder.toString();
return result;
}
//测试功能
public static void main(String[] args) {
MaxDictionaryOrder maxDictionaryOrder = new MaxDictionaryOrder();
String str = "aabcbccacbbcbaaba";
String result = maxDictionaryOrder.maxDictionaryOrder(str);
System.out.println(result);
System.out.println("cccccbba".equals(result));
}
}