当前位置 博文首页 > Inmaturity_7的博客:算法练习帖--30--单词规律(Java)

    Inmaturity_7的博客:算法练习帖--30--单词规律(Java)

    作者:[db:作者] 时间:2021-08-01 11:44

    单词规律

    一、题目介绍

    给定一种规律 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;
        }
    }
    
    cs