零 標題:演算法(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 歷史文章 - 總覽
2 博主簡介
碼農三少 ,一個致力於編寫 極簡、但齊全題解(演算法) 的博主。
專注於 一題多解、結構化思維 ,歡迎一起刷穿 LeetCode ~