iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
佛心分享-刷題不只是刷題

轉生理工組後從零開始的leetcode刷題系列 第 22

day-22[medium.2434]using a robot to print the lexicographically smallest string

  • 分享至 

  • xImage
  •  

You are given a string s and a robot that currently holds an empty string t. Apply one of the following operations until s and t are both empty:

Remove the first character of a string s and give it to the robot. The robot will append this character to the string t.
Remove the last character of a string t and give it to the robot. The robot will write this character on paper.
Return the lexicographically smallest string that can be written on the paper.


簡單來說我們有一個字串s和空字串t,然後有兩個行爲可以做:

  1. 把s字串的第一個字符移動到t
  2. 把t字串的最後一個字符移出到紙上
    重複前兩個行為直到s,t都變成空字串,目標是返回紙上的字(盡可能字典序最小的字串)
    老實說題目翻譯過後我依然沒有很懂,所以直接上題目範例比較好理解:
  • Example :
    Input: s = "bdda"
    Output: "addb"
    Explanation: Let p denote the written string.
    Initially p="", s="bdda", t="".
    Perform first operation four times p="", s="", t="bdda".
    Perform second operation four times p="addb", s="", t="".
    字典序的意思就是abcd...這樣的排列

我過了很久都想不到該怎麼解,
加上我的偏頭痛又發作了,最終決定求助chatgpt...我只負責了筆記註釋
它似乎是使用了模擬的方法
(用Stack來模擬字串t,堆疊符合後進先出的原則,適合模擬字符的添加和移除。)

  • stack.peek()=字符字典序

class Solution {
    public String robotWithString(String s) {
        // 存放t的堆疊
        Stack<Character> stack = new Stack<>();
        // 字串結果
        StringBuilder result = new StringBuilder();
        
        // 將s轉換成字元陣列,方便操作!
        char[] chars = s.toCharArray();
        // 儲存每個字元右邊最小的字元
        char[] rightMin = new char[chars.length];
        
        // 計算每個位置後方的最小字母,方便後續比對
        rightMin[chars.length - 1] = chars[chars.length - 1];
        for (int i = chars.length - 2; i >= 0; i--) {
            rightMin[i] = (char) Math.min(chars[i], rightMin[i + 1]);
        }
        
        // 遍歷字串s,模擬將字母加入t
        int i = 0;
        while (i < chars.length || !stack.isEmpty()) {
            // 當可以從s取字元並放入堆疊t時
            if (i < chars.length && (stack.isEmpty() || stack.peek() > rightMin[i])) {
                stack.push(chars[i]);
                i++;
            } else {
                // 如果棧中字符比目前s中的字母字典序小,則取出並放到結果中
                result.append(stack.pop());
            }
        }
        return result.toString();
    }
}


成功。
https://ithelp.ithome.com.tw/upload/images/20241006/20169432U4XjL3OQgr.png


上一篇
day-21[medium.2348]number of zero
下一篇
day-23[medium.2327]number of people aware of a secret
系列文
轉生理工組後從零開始的leetcode刷題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言