Easy
题目描述
给定一个只包含字符 ‘a’ 和 ‘b’ 的字符串 s,如果字符串中每个 ‘a’ 都出现在每个 ‘b’ 之前,则返回 true,否则返回 false。
示例 1:
输入:s = "aaabbb"
输出:true
解释:
'a' 位于索引 0、1 和 2,而 'b' 位于索引 3、4 和 5。
因此,每个 'a' 都出现在每个 'b' 之前,我们返回 true。
示例 2:
输入:s = "abab"
输出:false
解释:
索引 2 处有一个 'a',索引 1 处有一个 'b'。
因此,并非每个 'a' 都出现在每个 'b' 之前,我们返回 false。
示例 3:
输入:s = "bbb"
输出:true
解释:
没有 'a',因此每个 'a' 都出现在每个 'b' 之前,我们返回 true。
约束条件:
- 1 <= s.length <= 100
- s[i] 为 ‘a’ 或 ‘b’
提示:
- 你可以检查相反的情况:检查是否有 ‘b’ 出现在 ‘a’ 之前。然后取反并返回该答案。
- s 不应该包含任何 “ba” 作为子字符串的情况。
解题思路
这道题要求检查字符串中所有的 ‘a’ 是否都在所有的 ‘b’ 之前。我们可以从几个角度来思考这个问题:
方法一:检查是否存在 “ba” 子字符串 最直观的思路是,如果所有 ‘a’ 都在所有 ‘b’ 之前,那么字符串中不应该存在 “ba” 这样的子字符串。只要找到一个 ‘b’ 后面跟着 ‘a’ 的情况,就说明不满足条件。
方法二:一次遍历标记法 遍历字符串,使用一个布尔变量标记是否遇到过 ‘b’。如果已经遇到过 ‘b’ 后又遇到 ‘a’,则返回 false。
方法三:找到第一个 ‘b’ 和最后一个 ‘a’ 的位置 找到第一个 ‘b’ 的位置和最后一个 ‘a’ 的位置,如果最后一个 ‘a’ 在第一个 ‘b’ 之后,则返回 false。
**推荐解法:**方法一最简洁高效,直接检查字符串中是否包含 “ba” 子字符串即可。这种方法代码简洁,易于理解。
代码实现
class Solution {
public:
bool checkString(string s) {
return s.find("ba") == string::npos;
}
};
class Solution:
def checkString(self, s: str) -> bool:
return "ba" not in s
public class Solution {
public bool CheckString(string s) {
return !s.Contains("ba");
}
}
var checkString = function(s) {
return !s.includes("ba");
};
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 检查"ba"子字符串 | O(n) | O(1) |
| 一次遍历标记法 | O(n) | O(1) |
| 位置比较法 | O(n) | O(1) |
其中 n 为字符串长度。所有方法的时间复杂度都是 O(n),空间复杂度都是 O(1)。