<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實戰(zhàn)358:K 距離間隔重排字符串

          共 8277字,需瀏覽 17分鐘

           ·

          2021-08-24 17:30

          算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業(yè)務邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做 K 距離間隔重排字符串,我們先來看題面:
          https://leetcode-cn.com/problems/count-numbers-with-unique-digits/

          Given a non-empty string s and an integer k, rearrange the string such that the same characters are at least distance k from each other.


          All input strings are given in lowercase letters. If it is not possible to rearrange the string, return an empty string "".

          給你一個非空的字符串 s 和一個整數 k,你要將這個字符串中的字母進行重新排列,使得重排后的字符串中相同字母的位置間隔距離至少為 k。

          所有輸入的字符串都由小寫字母組成,如果找不到距離至少為 k 的重排結果,請返回一個空字符串 “”。

          示例


          示例 1:

          輸入: s = “aabbcc”, k = 3
          輸出: “abcabc”
          解釋: 相同的字母在新的字符串中間隔至少 3 個單位距離。

          示例 2:

          輸入: s = “aaabc”, k = 3
          輸出: “”
          解釋: 沒有辦法找到可能的重排結果。

          示例 3:

          輸入: s = “aaadbbcc”, k = 2
          輸出: “abacabcd”
          解釋: 相同的字母在新的字符串中間隔至少 2 個單位距離。


          解題

          https://blog.csdn.net/weixin_39029194/article/details/108190951

          貪心法,每次盡量取頻次大的字母加入結果
          1.統(tǒng)計每個字母出現的次數,存入map
          2.把所有的字母按照頻次排序存入隊列
          3.每次從隊列中取k個最大頻次的字母,加入結果字符串。
          4.然后相應頻次減一后再放回隊列。每次字符串長度要減掉K。最后一次不夠K個,就取最后一次遍歷的字符串的長度的字母加入結果字符串。

          class Solution {
              public String rearrangeString(String str, int k) {
                  if (k == 0) {
                      return str;
                  }
                  // 1.構建單詞與頻率的映射
                  Map<Character, Integer> map = new HashMap<>();
                  for (int i = 0; i < str.length(); i++) {
                      char ch = str.charAt(i);
                      if (map.containsKey(ch)) {
                          map.put(ch ,map.get(ch) + 1);
                      } else {
                          map.put(ch, 1);
                      }
                  }
                  // 2.將所有出現的字母按照頻率排序
                  PriorityQueue<Character> queue = new PriorityQueue<>((c1, c2) -> {
                      if (map.get(c2).intValue() != map.get(c1).intValue()) {
                          return map.get(c2) - map.get(c1);
                      } else {
                          // 如果頻率相同,按字典排序
                          return c1.compareTo(c2);
                      }
                  });
                  // 把字符放入隊列,頻率大的在前面
                  for (char c: map.keySet()) {
                      queue.offer(c);
                  }
                  // 試圖構建字符串
                  StringBuilder sb = new StringBuilder();
                  // 初始字符長度
                  int len = str.length();
                  // 3. 把字符按出現次數多的字符開始,把每一個字符插入到間隔中
                  while (!queue.isEmpty()) {
                      List<Character> tempChars = new ArrayList<>();
                      // 得到較小的數(最后剩下的一截可能不夠K)
                      int n = Math.min(k, len);
                      // 從queue里取出TopN位數字,填充每一個間隔區(qū)間
                      for (int i = 0; i < n; i++) {
                          // 在個數為N的間隔區(qū)間里,剩下的不重復的字符串已經用完了,那么必然構造不出間隔為N的無重復字符串了,
                          // 也就是在這個區(qū)間里必然有重復的字母,到這里就無法再繼續(xù)構造了
                          if (queue.isEmpty()) {
                              return "";
                          }
                          // 取出這個字符
                          char ch = queue.poll();
                          sb.append(ch);
                          // 取出這個字符,相應頻次要減1
                          map.put(ch, map.get(ch) - 1);
                          // 這個字符還有剩余,就加進來tempChars,重新放到queue里,進行下一次的遍歷
                          if (map.get(ch) > 0) {
                              tempChars.add(ch);
                          }
                          // 已經取過了,字符長度減1
                          len--;
                      }

                      // 4.每個字母減過一次了,把還有剩余次數的字母再次加入到queue里,繼續(xù)下一次的循環(huán)
                      for (Character tempChar : tempChars) {
                          queue.offer(tempChar);
                      }
                  }

                  return sb.toString();
              }

              public static void main(String[] args) {
                  Solution solution = new Solution();
                  String res = solution.rearrangeString("aabbcc", 3);
                  String res2 = solution.rearrangeString("aaabc", 3);
                  String res3 = solution.rearrangeString("aaadbbcc", 2);
                  System.out.println(res);
                  System.out.println(res2);
                  System.out.println(res3);
              }
          }


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉發(fā)吧,你們的支持是我最大的動力 。

          上期推文:

          LeetCode1-340題匯總,希望對你有點幫助!
          LeetCode刷題實戰(zhàn)341:扁平化嵌套列表迭代器
          LeetCode刷題實戰(zhàn)342:4的冪
          LeetCode刷題實戰(zhàn)343:整數拆分
          LeetCode刷題實戰(zhàn)344:反轉字符串
          LeetCode刷題實戰(zhàn)345:反轉字符串中的元音字母
          LeetCode刷題實戰(zhàn)346:數據流中的移動平均值
          LeetCode刷題實戰(zhàn)347:前 K 個高頻元素
          LeetCode刷題實戰(zhàn)348:設計井字棋
          LeetCode刷題實戰(zhàn)349:兩個數組的交集
          LeetCode刷題實戰(zhàn)350:兩個數組的交集 II
          LeetCode刷題實戰(zhàn)351:安卓系統(tǒng)手勢解鎖
          LeetCode刷題實戰(zhàn)352:將數據流變?yōu)槎鄠€不相交區(qū)間
          LeetCode刷題實戰(zhàn)353:貪吃蛇
          LeetCode刷題實戰(zhàn)354:俄羅斯套娃信封問題
          LeetCode刷題實戰(zhàn)355:設計推特
          LeetCode刷題實戰(zhàn)356:直線鏡像

          瀏覽 109
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文8aⅴ在线免费观看视频 | 男女在线观看视频 | 肏逼网| 国产成人麻豆免费观看 | 免费在线观看黄片网站 |