← Hashing

Word Pattern

Easy
Python
def word_pattern(pattern,s):
    words=s.split()
    if len(pattern)!=len(words): return False
    return len(set(zip(pattern,words)))==len(set(pattern))==len(set(words))
Java
public boolean wordPattern(String pattern,String s){
    String[] words=s.split(" ");
    if(pattern.length()!=words.length) return false;
    Map<Character,String> cs=new HashMap<>();
    Map<String,Character> sc=new HashMap<>();
    for(int i=0;i<pattern.length();i++){
        char c=pattern.charAt(i); String w=words[i];
        if(cs.containsKey(c)&&!cs.get(c).equals(w)) return false;
        if(sc.containsKey(w)&&sc.get(w)!=c) return false;
        cs.put(c,w); sc.put(w,c);
    } return true;
}

Key Insight

Python set+zip elegant. Java needs explicit bidirectional maps.

Python → Java Differences

  • Python set zip approach
  • Java bidirectional maps
  • Bijection check identical
Python
def word_pattern(pattern,s):
    words=s.split()
    if len(pattern)!=len(words): return False
    return len(set(zip(pattern,words)))==len(set(pattern))==len(set(words))
Java
public boolean wordPattern(String pattern,String s){
    String[] words=s.split(" ");
    if(pattern.length()!=words.length) return false;
    Map<Character,String> cs=new HashMap<>();
    Map<String,Character> sc=new HashMap<>();
    for(int i=0;i<pattern.length();i++){
        char c=pattern.charAt(i); String w=words[i];
        if(cs.containsKey(c)&&!cs.get(c).equals(w)) return false;
        if(sc.containsKey(w)&&sc.get(w)!=c) return false;
        cs.put(c,w); sc.put(w,c);
    } return true;
}

Algorithm Steps

1. Split words
2. Check bijection