算法练习帖--30--单词规律(Java)

单词规律

一、题目介绍

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
(题目来源:力扣(LeetCode))

示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false

二、解决方法

  1. 哈希表
package com.lxf.test;

import java.util.HashMap;
import java.util.Map;

public class WordPattern {
    
    
	public static void main(String[] args) {
    
    
		//"abba"
		///"dog cat cat dog"
		System.out.println(wordPattern("aaaa","dog cat cat dog"));
	}
	public static boolean wordPattern(String pattern, String s) {
    
    
		//将s字符串分割成字符串数组
		String[] sArr=s.split(" ");
		//获取s字符串数组的长度
		int sL=sArr.length;
		//排除一些特殊情况
		if(sL!=pattern.length()||pattern.equals("")||s.equals("")) {
    
    
			return false;
		}
		//存储映射值得map集合
		Map<Character, String> map=new HashMap<Character, String>();
		//循环比较
		for (int i = 0; i <sL; i++) {
    
    
			if(!map.containsKey(pattern.charAt(i))) {
    
    
				if(map.containsValue(sArr[i])) {
    
    
					//如果已经有这个映射值了,说明冲突了直接返回false
					return false;
				}
				//如果map中没有这个key和这个value,则把映射设置进去
				map.put(pattern.charAt(i), sArr[i]);
			}else {
    
    
				//含有这个映射得时候,比较映射是否正确
				if(!map.get(pattern.charAt(i)).equals(sArr[i])) {
    
    
					return false;
				}
			}
		}
		//循环所有映射都正确就返回true
		return true;
	}
}
  1. 哈希表(官方题解,双映射)
class Solution {
    
    
    public boolean wordPattern(String pattern, String str) {
    
    
        Map<String, Character> str2ch = new HashMap<String, Character>();
        Map<Character, String> ch2str = new HashMap<Character, String>();
        int m = str.length();
        int i = 0;
        for (int p = 0; p < pattern.length(); ++p) {
    
    
            char ch = pattern.charAt(p);
            if (i >= m) {
    
    
                return false;
            }
            int j = i;
            while (j < m && str.charAt(j) != ' ') {
    
    
                j++;
            }
            String tmp = str.substring(i, j);
            if (str2ch.containsKey(tmp) && str2ch.get(tmp) != ch) {
    
    
                return false;
            }
            if (ch2str.containsKey(ch) && !tmp.equals(ch2str.get(ch))) {
    
    
                return false;
            }
            str2ch.put(tmp, ch);
            ch2str.put(ch, tmp);
            i = j + 1;
        }
        return i >= m;
    }
}

猜你喜欢

转载自blog.csdn.net/Inmaturity_7/article/details/111302949