word pattern java_LeetCode Word Pattern II

题目:

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty substring in str.

Examples:

pattern = "abab", str = "redblueredblue" should return true.

pattern = "aaaa", str = "asdasdasdasd" should return true.

pattern = "aabb", str = "xyzabcxzyabc" should return false.

Notes:

You may assume both pattern and str contains only lowercase letters.

题解:

类似Word Pattern. 但这里没有明确分割words的空格.

采用backtracking, 用pattern内的一个char来试着match不同长度的str substring, 能同时试到pattern 和 str的结尾, 就返回true.

e.g. pattern = "abab", str = "redblueredblue", 先用"a" match "r", "b" match "e", 又遇到"a", 但str里确实"d", 不match.

就backtracking下然后用"b" match "ed", 以此类推.

用HashMap 来保存已经走过的pattern char 和 str substring对应关系.

同时maintain一个set用来避免相同的string 来match 不同的char. e.g. "a" match "cde", "b"也match "cde".

Time Complexity: exponential. Space: O(hm.size() + hs.size()).

AC Java:

1 public classSolution {2 public booleanwordPatternMatch(String pattern, String str) {3 HashMap hm = new HashMap();4 HashSet hs = new HashSet();5 return isMatch(pattern, 0, str, 0, hm, hs);6 }7

8 private boolean isMatch(String pattern, int i, String str, int j, HashMap hm, HashSeths){9 //stop condition

10 if(i == pattern.length() && j ==str.length()){11 return true;12 }13 if(i == pattern.length() || j ==str.length()){14 return false;15 }16

17 char c =pattern.charAt(i);18

19 //If current pattern character already exists in map

20 if(hm.containsKey(c)){21 String cString =hm.get(c);22

23 //If corresponding string does not match str.substring(j, j+matchedString.length()).

24 if(!str.startsWith(cString, j)){25 return false;26 }27 return isMatch(pattern, i+1, str, j+cString.length(), hm, hs);28 }else{29 //current pattern character doesn't exist in the map

30 for(int k = j; k

33 //different strings can't be matched to same char

34 if(hs.contains(s)){35 continue;36 }37

38 hm.put(c, s);39 hs.add(s);40

41 //if all reset string could be matched

42 if(isMatch(pattern, i+1, str, k+1, hm, hs)){43 return true;44 }45

46 hm.remove(c);47 hs.remove(s);48 }49

50 //Have tried all different lengths

51 return false;52 }53 }54 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值