ORID42

2020-07-18  本文已影响0人  Wilbur_

今天终于突破了100题大关,自己也成为了战斗力100的渣渣。

[1370] Increasing Decreasing String 解题报告

用什么算法

dp
这道题给出了步骤,你实际上要做的就是实现他想要的排序就可以了。
他要先从小到大把s这个string里面的字母排序(第二个字母要比第一个字母大)
然后再反过来
比如"abcabc", 按照题目要求排过序之后应该是"abccba"。
这道题的要点就在记住每个字母的出现频率,然后直接按照从小到大取就可以了
比如"abcabc", a出现了两次,你开一个int[26]的数组,0代表a,25代表z,然后每个数组记录的就是这个字母出现了多少次,然后从小到大取一个。再从大到小取一个(就是按照题目要求做)
就完成了!

代码实现

public String sortString(String s) {
        char[] ss = s.toCharArray();
        int n = ss.length, min = Integer.MAX_VALUE;
        StringBuilder sb = new StringBuilder(n);
        int[] freq = new int[26];
        for (int i = 0; i < n; i++) {
            freq[ss[i] - 'a']++; //important of how to count frequency from given string 
        }
        //proceed to the question 
        int count = 0;
        while (count < n) {
            //increasing order
            for (int i = 0; i < 26; i++) {
                if (freq[i] > 0) {
                    sb.append((char) (i + 'a'));
                    freq[i]--;
                    count++;
                } else {
                    continue;
                }                
            }
            //decreasing order
            for (int i = 25; i >= 0; i--) {
                if (freq[i] > 0) {
                    sb.append((char) (i + 'a'));
                    freq[i]--;
                    count++;
                } else {
                    continue;
                }
            }
        }
        return sb.toString();
    }

注意这里

       for (int i = 0; i < n; i++) {
            freq[ss[i] - 'a']++; //important of how to count frequency from given string 
        }

才是关键,我也标注了。因为从0到s.length这个for loop是在记录每个字母出现了多少次(frequency),然后之后的while loop就是在实现题目要求。每次从小到大,只要这个字母当前计数大于0(也就是还能提取出来),那就放到stringbuilder里面去,最后return stringbuilder就好了。

上一篇下一篇

猜你喜欢

热点阅读