面試題
判斷一個字符串的構成是詞+空格的組合,如"上海 深圳 深圳 上海",要求輸入一個匹配模式,
比如aabb,來判斷該字符串是否符合該模式
1.pattern="abba" s="上海 深圳 深圳 上海" 返回true
2.pattern="aabb" s="上海 深圳 深圳 上海" 返回false
3.pattern="baab" s="上海 深圳 深圳 上海" 返回true
解決思路1
先寫個匹配規則函數,如輸入["a","b","b","a"],函數返回[1, 2, 2, 1]
輸入["上海", "深圳", "深圳", "上海"],函數返回[1, 2, 2, 1]
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def pattern_rule(s1):
"""
傳s1返回其匹配規則如:1221
:param s1: s1是傳入的list->["a","b","b","a"]
或傳入list->["上海", "深圳", "深圳", "上海"]
:return: list->[1, 2, 2, 1]
"""
result = []
temp = []
num = 0
for i in s1:
if i not in temp:
temp.append(i)
num += 1
result.append(num)
else:
result.append(temp.index(i)+1)
return result
if __name__ == '__main__':
s="上海 深圳 深圳 上海"
print(pattern_rule(s.split(" ")))
pattern="abba"
print(pattern_rule(list(pattern)))
運行結果
[1, 2, 2, 1]
[1, 2, 2, 1]
通過判斷函數返回的結果,來判斷字符串是不是該模式
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def pattern_rule(s1):
"""
傳s1返回其匹配規則如:1221
:param s1: s1是傳入的list->["a","b","b","a"]
或傳入list->["上海", "深圳", "深圳", "上海"]
:return: list->[1, 2, 2, 1]
"""
result = []
temp = []
num = 0
for i in s1:
if i not in temp:
temp.append(i)
num += 1
result.append(num)
else:
result.append(temp.index(i)+1)
return result
def is_pattern(pattern="abba", s="上海 深圳 深圳 上海"):
"""判斷2個的結果是否一致"""
r1 = pattern_rule(s.split(" "))
r2 = pattern_rule(list(pattern))
return "true" if r1 == r2 else "false"
if __name__ == '__main__':
print(is_pattern(pattern="abba"))
print(is_pattern(pattern="aabb"))
print(is_pattern(pattern="baab"))
print(is_pattern(pattern="abc", s="上海 深圳 杭州"))
運行結果
true
false
true
true
解決思路2
直接拿2個字符串當成列表循環對比,用一個臨時字典temp,保存為鍵值對格式:{'a': '上海', 'b': '深圳'}
如果下一個key在字典中存在,就不添加字典,從字典取值跟s里面的值對比
如果下一個key在字典中不存在,就添加字典
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def is_pattern(pattern="acba", s="上海 深圳 深圳 上海"):
p1 = list(pattern)
s1 = s.split(" ")
if not p1 or not s1 or len(p1) != len(s1):
return False
temp = {}
flag = True
for i in range(len(p1)):
if p1[i] not in temp.keys() and s1[i] not in temp.values():
temp[p1[i]] = s1[i]
else:
if temp.get(p1[i]) != s1[i]:
flag = False
return flag
if __name__ == '__main__':
print(is_pattern(pattern="abba", s="上海 深圳 深圳 上海"))
print(is_pattern(pattern="acba", s="上海 深圳 深圳 上海"))
print(is_pattern(pattern="baab", s="上海 深圳 深圳 上海"))
print(is_pattern(pattern="abc", s="上海 深圳 北京"))
print(is_pattern(pattern="aabc", s="上海 深圳 北京 上海"))
print(is_pattern(pattern="abca", s="上海 深圳 北京 上海"))
運行結果
True
False
True
True
False
True