有时候人们会用重复写一些字母来表示额外的感受,比如 "hello" -> "heeellooo"
, "hi" -> "hiii"
。我们将相邻字母都相同的一串字符定义为相同字母组,例如:”h”, “eee”, “ll”, “ooo”。
对于一个给定的字符串 S ,如果另一个单词能够通过将一些字母组扩张从而使其和 S 相同,我们将这个单词定义为可扩张的(stretchy)。扩张操作定义如下:选择一个字母组(包含字母 c
),然后往其中添加相同的字母 c
使其长度达到 3 或以上。
例如,以 “hello” 为例,我们可以对字母组 “o” 扩张得到 “hellooo”,但是无法以同样的方法得到 “helloo” 因为字母组 “oo” 长度小于 3。此外,我们可以进行另一种扩张 “ll” -> “lllll” 以获得 “helllllooo”。如果 s = "helllllooo"
,那么查询词 “hello” 是可扩张的,因为可以对它执行这两种扩张操作使得 query = "hello" -> "hellooo" -> "helllllooo" = s
。
输入一组查询单词,输出其中可扩张的单词数量。

思路:先排序并统计个数,然后去除特殊情况后剩下的就是符合情况的。
python3实现:
class Solution:
def expressiveWords(self, s: str, words: List[str]) -> int:
final_count = 0
s_ = self.get_key_and_count(s)
s_key = s_[0]
s_value = s_[1]
for elem in words:
result = self.get_key_and_count(elem)
result_key = result[0]
result_value = result[1]
if result_key == s_key:
single_count = 0
for idx in range(len(result_value)):
if result_value[idx] > s_value[idx]:
print(f"{result_value[idx]} da")
break
if result_value[idx] != s_value[idx]:
if s_value[idx] <= 2:
print(f"{s_value[idx]} xiao")
break
single_count += 1
if single_count == len(result_value):
final_count += 1
else:
break
return final_count
def get_key_and_count(self, target):
p = 1
tmp = target[0]
new = tmp
count_list = []
tmp_count = 1
while p <= len(target) - 1:
if target[p] == tmp:
tmp_count += 1
else:
count_list.append(tmp_count)
tmp = target[p]
tmp_count = 1
new += tmp
p += 1
count_list.append(tmp_count)
return new,count_list
