0%

最低字典序排列字符串

题目

给定一个字符串类型的数组 strs , 找到一种拼接方式, 使得把所有字符串拼接起来之后形成的字符串具有最低的字典序.

题解

不可通过将各个数组元素按字典序排列再拼接的方式来解, 如对数组 ['b', 'ba'] 来说, 若按元素字典序来排列将得到 bba , 而实际上该结果并没有 bab 小, 故这种做法不可取.

本题应比较 str1 + str2str2 + str1 的字典序大小, 以此为标准重写比较函数, 排序后拼接即可.

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class LowestLexicography {
public static String lowestString(String[] strs) {
if (strs == null || strs.length == 0) {
return null;
}

Arrays.sort(strs, (a, b) -> (a + b).compareTo(b + a));

String result = "";
for (String str : strs) {
result += str;
}

return result;
}
}

Python

以冒泡排序为例

1
2
3
4
5
6
7
def get_lowest_lexicography(strings):
for i in range(len(strings)):
for j in range(len(strings) - 1):
if strings[j] + strings[j + 1] > strings[j + 1] + strings[j]:
strings[j], strings[j + 1] = strings[j + 1], strings[j]

return "".join(strings)

Go

1
2
3
4
5
6
7
8
9
10
11
func getLowestLexicography(strs []string) string {
for i := 0; i < len(strs); i++ {
for j := 0; j < len(strs)-1; j++ {
if strs[j]+strs[j+1] > strs[j+1]+strs[j] {
strs[j], strs[j+1] = strs[j+1], strs[j]
}
}
}

return strings.Join(strs, "")
}