问题描述
小U正在研究字符串的转换问题。他发现一个由字母 'a' 组成的字符串被称为“基本”字符串。现在给定一个长度为N的字符串S,该字符串中的字符从0到N-1进行编号。在每次操作中,你可以选择三个索引i、j和k,其中i < j < k,并且满足 S[i] 和 S[k] 都是 'a',然后你可以将 S[j] 的字符也设置为 'a'。
你的任务是判断是否可以通过多次执行该操作,将字符串S变为一个基本字符串。如果可以,将返回 1;否则返回 0。
测试样例
样例1:
输入:
N = 7, S = "aaacaaa"
输出:True
样例2:
输入:
N = 5, S = "ababa"
输出:True
样例3:
输入:
N = 6, S = "aaaaab"
输出:False
我的初步思路是:
- 如果字符串中没有 'a',直接返回
False。 - 如果字符串中所有字符都是 'a',直接返回
True - 遍历字符串,记录所有 'a' 的位置
- 对于每个非 'a' 的字符
S[j],检查是否存在位于j左边的 'a' 位置i和位于j右边的 'a' 位置k。 - 如果找到了这样的
i和k,则将S[j]的位置添加到 'a' 的位置列表中,表示可以通过操作将S[j]变为 'a'。 - 如果没有找到这样的
i和k,则返回False - 如果遍历完成,所有非 'a' 的字符都可以通过操作变为 'a',则返回
True
结合AI刷题提供的思路提示功能:
算法步骤
-
初始化一个空列表
a_positions用于记录'a'的位置。 -
遍历字符串
S:- 如果当前字符是
'a',将其位置加入a_positions。 - 如果当前字符不是
'a',检查a_positions中是否存在一个位置i在当前位置的左边,并且存在一个位置k在当前位置的右边。
- 如果当前字符是
-
如果所有非
'a'的字符都可以通过上述操作变为'a',则返回True,否则返回False
然后一顿代码操作之后,不出意外的报错了。
然后这时再使用AI刷题的代码提示发现为什么有些字符串不行?
例如考虑 S = "aabba"的时候,这里中间的两个 'b' 没有办法变成 'a',因为它们左边没有 'a',或者右边没有 'a' 来满足 i < j < k 的条件,以及S[i] 和 S[k] 都是'a' 的条件。然后发现这个问题的更需要的代码是是:判断给定的字符串中,所有不是 'a' 的字符是否都能找到符合条件的 'a' 来进行转换
就在这样的思路尝试写后,终于得到了最终代码:
def solution(N: int, S: str) -> bool: if 'a' not in S: return False if S == "a" * N: return True a_indices = [i for i, char in enumerate(S) if char == 'a'] for j in range(N): if S[j] != 'a': i = None for a_index in a_indices: if a_index < j: i = a_index break k = None for a_index in a_indices: if a_index > j: k = a_index break if i is not None and k is not None: a_indices.append(j) else: return False return True if name == 'main': print(solution(N = 7, S = "aaacaaa") == True) print(solution(N = 5, S = "ababa") == True) print(solution(N = 6, S = "aaaaab") == False)