leetcode 290 Word Pattern
题目链接:https://leetcode.com/problems/word-pattern/
思路分析:题目要求判断在pattern中的字符与str中的非空word之间是否存在双射,解法如代码所示。
循环不变量:当 I = k 时,并进行迭代时,pattern[0..i-1]与strings[0..i-1]之间满足双射关系
循环不变量证明:
1> 初始化:当 I = 0时,I – 1 = -1,则pattern[0..i-1]与strings[0..i-1]都为空,满足循环不变式
2> 保持:分情况讨论:
- 当 hashtable[pattern[i]]不为None时,即pattern[i]存在于pattern[0..i-1]中,因为满足双射,则strings[i]应该和strings[hashtable[pattern[i]]]相等
- 当hashtable[pattern[i]]为None时,则pattern[i]不存在于pattern[0..i-1]中,因为同样要满足双射,则strings[i]必须不存在于strings[0..i-1]中,如果strings[i]存在于strings[0..i-1]中,则strings[i]同时映射在pattern[0..i]中的两个不同字符,不满足双射
3>终止:当i==len(pattern)时,循环终止,此时pattern[0..len-1]与strings[0..len-1]之间存在双射
算法证明成立
代码如下:
class Solution(object): def wordPattern(self, pattern, str): """ :type pattern: str :type str: str :rtype: bool """ strings = str.split() hashtable, charset = {}, set() if len(pattern) != len(strings): return False for i, ch in enumerate(pattern): string = hashtable.get(ch) if not string: if strings[i] in hashtable.values(): return False hashtable[ch] = strings[i] else: if string != strings[i]: return False return True