给定一个模式和一个字符串str,找到str是否遵循相同的 图案。
以下是完全匹配,以便在两者之间存在双射 模式中的字母和str中的非空字。
例子:pattern =" abba",str ="狗猫猫"应该回来 真。
pattern =" abba",str =" dog cat cat fish"应该返回false。
pattern =" aaaa",str =" dog cat cat dog"应该返回false。
pattern =" abba",str ="狗狗狗狗"应该返回false。
注意:您可以假设模式仅包含小写字母和str 包含由单个空格分隔的小写字母。
class Solution
{
func wordPattern(pattern: String, _ str: String) -> Bool
{
let arr = str.characters.split{$0 == " "}.map(String.init)
if arr.count != pattern.characters.count
{
return false
}
var dict = [Character:String]()
for i in (0...arr.count-1)
{
let cha = pattern[pattern.startIndex.advancedBy(i)]
if dict.keys.contains(cha)
{
if dict[cha]! != arr[i]
{
return false
}
}
else
{
if dict.values.contains(dict[cha]!)
//fatal error: unexpectedly found nil while unwrapping an Optional value
{
return false
}
dict[cha] = arr[i]
}
}
return true
}
}
var test = Solution()
var result = test.wordPattern("abba", "dog cat cat dog")
print(result)
我不知道"致命错误:在展开时意外发现零 可选值"。任何帮助,我很感激。非常感谢你!
答案 0 :(得分:1)
修改你的条件。
当else
为dict.keys.contains(cha)
时,false
分支执行,换句话说,当字典不包含cha
时。然后,您尝试访问已知必须返回dict[cha]
的{{1}}(因为nil
不在字典中)。然后你试着打开它。展开cha
会导致您的应用崩溃。
还要考虑条件是尝试检查从字典中获取的值是否包含在字典中。你想做什么?
你想要的只是(注意没有讨厌的nil
):
!