Skip to content

Commit e780779

Browse files
committed
上升下降字符串
1 parent 8701e87 commit e780779

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.leetcode_cn.easy;
2+
/********上升下降字符串******/
3+
4+
5+
/**
6+
* 给你一个字符串 s ,请你根据下面的算法重新构造字符串:
7+
*
8+
* 1.从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。
9+
* 2.从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。
10+
* 3.重复步骤 2 ,直到你没法从 s 中选择字符。
11+
* 4.从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。
12+
* 5.从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。
13+
* 6.重复步骤 5 ,直到你没法从 s 中选择字符。
14+
*
15+
* 重复步骤 1 到 6 ,直到 s 中所有字符都已经被选过。
16+
* 在任何一步中,如果最小或者最大字符不止一个 ,你可以选择其中任意一个,并将其添加到结果字符串。
17+
*
18+
* 请你返回将 s 中字符重新排序后的 结果字符串 。
19+
*
20+
*
21+
* 示例 1:
22+
*
23+
* 输入:s = "aaaabbbbcccc"
24+
* 输出:"abccbaabccba"
25+
* 解释:第一轮的步骤 1,2,3 后,结果字符串为 result = "abc"
26+
* 第一轮的步骤 4,5,6 后,结果字符串为 result = "abccba"
27+
* 第一轮结束,现在 s = "aabbcc" ,我们再次回到步骤 1
28+
* 第二轮的步骤 1,2,3 后,结果字符串为 result = "abccbaabc"
29+
* 第二轮的步骤 4,5,6 后,结果字符串为 result = "abccbaabccba"
30+
*
31+
* 示例 2:
32+
*
33+
* 输入:s = "rat"
34+
* 输出:"art"
35+
* 解释:单词 "rat" 在上述算法重排序以后变成 "art"
36+
* 示例 3:
37+
*
38+
* 输入:s = "leetcode"
39+
* 输出:"cdelotee"
40+
* 示例 4:
41+
*
42+
* 输入:s = "ggggggg"
43+
* 输出:"ggggggg"
44+
* 示例 5:
45+
*
46+
* 输入:s = "spo"
47+
* 输出:"ops"
48+
*  
49+
* 提示:
50+
*
51+
* 1 <= s.length <= 500
52+
* s 只包含小写英文字母。
53+
*
54+
*/
55+
public class increasingDecreasingString {
56+
57+
public static void main(String[] args) {
58+
System.out.println(sortString("aaaabbbbcccc"));
59+
}
60+
61+
public static String sortString(String s) {
62+
if (s == null || s == "") return "";
63+
int[] letterNums = new int[26];
64+
char[] letters = s.toCharArray();
65+
StringBuilder result = new StringBuilder();
66+
// 遍历统计相同字符个数
67+
for (char letter : letters) {
68+
letterNums[letter - 'a']++;
69+
}
70+
while (hasNum(letterNums)) {
71+
// 先从小到大
72+
for (int i = 0; i < letterNums.length; i++) {
73+
if (letterNums[i] > 0) {
74+
result.append((char)(i + 'a'));
75+
letterNums[i]--;
76+
}
77+
}
78+
// 再从大到小
79+
for (int i = letterNums.length - 1; i >= 0; i--) {
80+
if (letterNums[i] > 0) {
81+
result.append((char)(i + 'a'));
82+
letterNums[i]--;
83+
}
84+
}
85+
}
86+
return result.toString();
87+
}
88+
89+
/**
90+
* 判断是否还有剩余的字符未被处理
91+
* @param letterNums
92+
* @return
93+
*/
94+
private static boolean hasNum(int[] letterNums) {
95+
for (int letterNum : letterNums) {
96+
if (letterNum > 0)
97+
return true;
98+
}
99+
return false;
100+
}
101+
}

0 commit comments

Comments
 (0)