2124、檢查是否所有 A 都在 B 之前 | 演算法(leetode,附思維導圖 + 全部解法)300題

碼農三少發表於2022-02-27

零 標題:演算法(leetode,附思維導圖 + 全部解法)300題之(2124)檢查是否所有 A 都在 B 之前

一 題目描述

題目描述
題目描述

二 解法總覽(思維導圖)

思維導圖

三 全部解法

1 方案1

1)程式碼:

// 方案1 “排序、對比法”。

// 思路:
// 1)將 s 按字母升序排列,得到字串 sSort 。
// 2)返回結果 sSort === s 。
var checkString = function(s) {
    // 1)將 s 按字母升序排列,得到字串 sSort 。
    const sSort = s.split('').sort((a, b) => a.localeCompare(b)).join('');
    
    // 2)返回結果 sSort === s 。
    return sSort === s;
};

2 方案2

1)程式碼:

// 方案2 “雙指標法”。

// 思路:
// 1)狀態初始化,left = 0, right = l - 1, resBool = true 。

// 2)當 left < right 時,下標 left、right 不斷往中間靠。
// 2.1)若 leftVal(即 s[left]) 等於 'a',則 下標left 往後走。
// 2.2)若 rightVal(即 s[right]) 等於 'b',則 下標right 往前走。
// 2.3)若 leftVal 不等於 'a' 且 rightVal 不等於 'b',則 resBool 置為 false,退出 while 迴圈。

// 3)返回結果 resBool 。
var checkString = function(s) {
    // 1)狀態初始化,left = 0, right = l - 1, resBool = true 。
    const l = s.length;
    let left = 0,
        right = l - 1,
        resBool = true;
    
    // 2)當 left < right 時,下標 left、right 不斷往中間走。
    while (left < right) {
        const leftVal = s[left],
            rightVal = s[right];
        
        // 2.1)若 leftVal(即 s[left]) 等於 'a',則 下標left 往後走。
        if (leftVal === 'a') {
            left++;
        }
        // 2.2)若 rightVal(即 s[right]) 等於 'b',則 下標right 往前走。
        if (rightVal === 'b') {
            right--;
        }
        // 2.3)若 leftVal 不等於 'a' 且 rightVal 不等於 'b',則 resBool 置為 false,退出 while 迴圈。
        if (leftVal !== 'a' && rightVal !== 'b') {
            resBool = false;
            break;
        }
    }

    // 3)返回結果 resBool 。
    return resBool;
}

3 方案3

1)程式碼:

// 方案3 “問題等價 - 轉化法”。

// 技巧:通過 進一步揣摩題目意思,可以將原問題 轉換成 “給定的字串中 是否不存在 'ba'子串 ” 。
var checkString = function(s) {
    return s.includes('ba') === false;
}

4 方案4

1)程式碼:

// 方案4 “問題等價 - 轉化法(正則實現,初步看、速度會比方案3快好些~)”。
// 技巧:通過 進一步揣摩題目意思,可以將原問題 轉換成 “給定的字串中 是否不存在 'ba'子串 ” 。
var checkString = function(s) {
    const reg = /ba/;

    return reg.test(s) === false;
}

四 資源分享 & 更多

1 歷史文章 - 總覽

歷史文章 - 總覽

刷題進度 - LeetCode:430 / 2520 、《劍指offer》:66 / 66

2 博主簡介

碼農三少 ,一個致力於編寫 極簡、但齊全題解(演算法) 的博主。
專注於 一題多解、結構化思維 ,歡迎一起刷穿 LeetCode ~

相關文章