力C演算法JS:1544. 整理字串

gamebus發表於2021-09-09

題目描述

給你一個由大小寫英文字母組成的字串 s 。

一個整理好的字串中,兩個相鄰字元 s[i] 和 s[i+1],其中 0

若 s[i] 是小寫字元,則 s[i+1] 不可以是相同的大寫字元。
若 s[i] 是大寫字元,則 s[i+1] 不可以是相同的小寫字元。
請你將字串整理好,每次你都可以從字串中選出滿足上述條件的 兩個相鄰 字元並刪除,直到字串整理好為止。

請返回整理好的 字串 。題目保證在給出的約束條件下,測試樣例對應的答案是唯一的。
注意:空字串也屬於整理好的字串,儘管其中沒有任何字元。

示例1

輸入:s = "leEeetcode"
輸出:"leetcode"
解釋:無論你第一次選的是 i = 1 還是 i = 2,都會使 "leEeetcode" 縮減為 "leetcode"

示例2

輸入:s = "abBAcC"
輸出:""
解釋:存在多種不同情況,但所有的情況都會導致相同的結果。例如:
"abBAcC" --> "aAcC" --> "cC" --> ""
"abBAcC" --> "abBA" --> "aA" --> ""

解題思路

一, JS API

Math.abs(); // 獲取絕對值
String.prototype.charCodeAt() // 獲取字元 ASCII 碼值

字元的 ASCII 碼值

'a'.charCodeAt() //97
'A'.charCodeAt() //65

'b'.charCodeAt() //98
'B'.charCodeAt() //66

∵ 同一小寫字母與大寫字母相減 為 ±32
∴ 當s[i]與s[i-1]是同一字母,且只有一個是大寫時:

 Math.abs(s[i].charCodeAt()-s[i-1].charCodeAt())===32

佇列入棧

var makeGood = function (str) {
 // 佇列 q 存輸入,棧 s 存輸出,都用陣列表示
 let q = str.split(''),s = [];
 
 // 迭代佇列
 while (q.length) {
    
    // 出隊字元
    let curS = q.shift()

    // 出隊字元ASCII
    let curV = curS.charCodeAt()
    
    // 棧尾字元ASCII
    let preV = s[s.length - 1] && s[s.length - 1].charCodeAt()

    // 如果出隊字元與棧尾字元 符合題意需要刪除的條件
    if (preV && Math.abs(curV - preV) === 32) {
      
      // 出棧
      s.pop()
    } else {

      // 入棧
      s.push(curS)
    }
 }
 
// 輸出
 return s.join('')
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2797186/,如需轉載,請註明出處,否則將追究法律責任。

相關文章