【JAVA】【刷题子】890. 查找和替换模式

240 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

一、题目与题目分析

题目

  你有一个单词列表 words 和一个模式  pattern,你想知道 words 中的哪些单词与模式匹配。
  如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。
  (回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)
  返回 words 中与给定模式匹配的单词列表。
  你可以按任何顺序返回答案。
image.png   (题目来源:力扣: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;
	}
} 

三、结果展示

image.png

四、人生总结

如果事情可以简简单单的,那么就让它简简单单就好了。

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)