持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
一、题目与题目分析
题目
你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。
如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。
(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)
返回 words 中与给定模式匹配的单词列表。
你可以按任何顺序返回答案。
(题目来源:力扣:890. 查找和替换模式)
题目分析
简单的理解就是找匹配指定格式的单词;类似中文词语的匹配,AAB、ABB、AABB、ABAB、AABC等等这种指定格式。
二、整体逻辑与主要代码
题目分析已经比较清楚了,接下来我们进入代码设计。
整体逻辑
既然需要匹配的是指定格式(pattern),我们可以从字母表去入手。去定义两个字母表(记录26个字母),遍历单词(word)对应的字母;对比两个字母数组表对应的值是否已经赋过其他字母对应的值,有就说明该单词不匹配。
主要代码
整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)
class Solution {
public List<String> findAndReplacePattern(String[] words, String pattern) {
// 定义匹配的结果List集
List<String> resList = new ArrayList<String>();
for (String word : words) { // 遍历所有单词
if (isMatch(word, pattern)) {
resList.add(word);
}
}
return resList;
}
// 判断该单词是否匹配字典
public boolean isMatch(String word, String pattern) {
int[] wordAlphabet = new int[27]; // 新建记录单词的字母表
int[] patternAlphabet = new int[27]; // 新建记录词典的字母表
boolean rightFlag = true; // 标记符合的字母进行添加
for (int i = 0; i < pattern.length(); i++) { // 遍历词典的每个字母
// 记录单词的每个字母
int wordNum = word.charAt(i) - 'a' + 1;
// 记录词典的每个字母
int patternNum = pattern.charAt(i) - 'a' + 1;
if ((patternAlphabet[wordNum] != 0
&& patternAlphabet[wordNum] != patternNum)
|| (wordAlphabet[patternNum] != 0
&& wordAlphabet[patternNum] != wordNum)) {
// 对比两个字母数组表对应的值是否已经赋过其他字母对应的值,有就说明该单词不匹配
rightFlag = false;
break;
}
patternAlphabet[wordNum] = patternNum;
wordAlphabet[patternNum] = wordNum;
}
return rightFlag;
}
}
三、结果展示
四、人生总结
如果事情可以简简单单的,那么就让它简简单单就好了。
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)