1.字典序大小比较方法
对于两个不同的字符串,从左到右逐个比较它们的字符,
如果在某个位置上它们的字符不同,则将它们按照该位置上的字符的字母顺序进行排序,即较小的字符排在前面,较大的字符排在后面。
如果一直比较到其中一个字符串结束,则较短的字符串排在前面;
如果两个字符串完全相同,则它们的字典序相同。可以将它们看作是按照字母表的顺序进行排列的。
2.力扣例题
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。
你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。
示例 1:
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
示例 2:
输入:n = 2
输出:[1,2]
class Solution {
private List < Integer > res= new ArrayList < > ( ) ;
private int n;
public List < Integer > lexicalOrder ( int n) {
this . n= n;
for ( int i = 1 ; i <= 9 ; i++ ) {
dfs ( i) ;
}
return res;
}
private void dfs ( int n) {
if ( n> this . n) {
return ;
}
res. add ( n) ;
for ( int i = 0 ; i <= 9 ; i++ ) {
dfs ( n* 10 + i) ;
}
}
}
给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换 s 中的一个字符。
请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操作次数的方案不止一种,则只需选取 字典序最小 的方案。
对于两个长度相同的字符串 a 和 b ,在 a 和 b 出现不同的第一个位置,如果该位置上 a 中对应字母比 b 中对应字母在字母表中出现顺序更早,则认为 a 的字典序比 b 的字典序要小。
返回最终的回文字符串。
示例 1:
输入:s = "egcfe"
输出:"efcfe"
解释:将 "egcfe" 变成回文字符串的最小操作次数为 1 ,修改 1 次得到的字典序最小回文字符串是 "efcfe",只需将 'g' 改为 'f' 。
示例 2:
输入:s = "abcd"
输出:"abba"
解释:将 "abcd" 变成回文字符串的最小操作次数为 2 ,修改 2 次得到的字典序最小回文字符串是 "abba" 。
示例 3:
输入:s = "seven"
输出:"neven"
解释:将 "seven" 变成回文字符串的最小操作次数为 1 ,修改 1 次得到的字典序最小回文字符串是 "neven" 。
class Solution {
public String makeSmallestPalindrome ( String s) {
StringBuilder sb= new StringBuilder ( s) ;
int len= sb. length ( ) ;
for ( int i = 0 ; i < len/ 2 ; i++ ) {
if ( sb. charAt ( i) != sb. charAt ( len- i- 1 ) ) {
char c= ( char ) Math . min ( sb. charAt ( i) , sb. charAt ( len- i- 1 ) ) ;
sb. setCharAt ( i, c) ;
sb. setCharAt ( len- i- 1 , c) ;
}
}
return sb. toString ( ) ;
}
}