使用kotlin解决这个问题:290. 单词规律 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern = "abba", s = "dog cat cat dog" 输出: true 示例 2: 输入:pattern = "abba", s = "dog cat cat fish" 输出: false 示例 3: 输入: pattern = "aaaa", s = "dog cat cat dog" 输出: false 提示: 1 <= pattern.length <= 300 pattern 只包含小写英文字母 1 <= s.length <= 3000 s 只包含小写英文字母和 ' ' s 不包含 任何前导或尾随对空格 s 中每个单词都被 单个空格 分隔
时间: 2024-02-15 07:04:06 浏览: 129
以下是使用 Kotlin 解决该问题的代码:
```kotlin
fun wordPattern(pattern: String, s: String): Boolean {
val words = s.split(" ")
if (pattern.length != words.size) return false
val pToW = mutableMapOf<Char, String>()
val wToP = mutableMapOf<String, Char>()
for (i in pattern.indices) {
val p = pattern[i]
val w = words[i]
if (pToW.containsKey(p)) {
if (pToW[p] != w) return false
} else {
if (wToP.containsKey(w)) return false
pToW[p] = w
wToP[w] = p
}
}
return true
}
```
该函数接受两个参数 `pattern` 和 `s`,分别表示规律和字符串。
首先,我们将字符串 `s` 按照空格拆分成一个单词数组 `words`,如果规律的长度和单词数组的长度不一致,那么返回 `false`。
接着,我们使用两个哈希表 `pToW` 和 `wToP` 分别记录规律中每个字母对应的单词和每个单词对应的字母。然后,我们遍历规律中的每个字母和单词数组中的每个单词,进行如下判断:
- 如果 `pToW` 中已经包含了当前字母 `p`,那么检查它对应的单词是否等于当前单词 `w`,如果不等于,那么返回 `false`。
- 如果 `pToW` 中不包含当前字母 `p`,那么检查 `wToP` 中是否包含当前单词 `w`,如果包含,说明当前单词已经被之前的字母使用过了,返回 `false`,否则将当前字母和单词分别添加到 `pToW` 和 `wToP` 中。
最后,如果没有返回 `false`,那么说明规律和字符串匹配,返回 `true`。
阅读全文