​package cn.edu.xidian.sselab.hashtable;

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

/**
 *
 * @author zhiyong wang
 * title: Word Pattern
 * content:
 * 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 word in str.
 *
 *        Examples:
 *
 *    pattern = "abba", str = "dog cat cat dog" should return true.
 *    pattern = "abba", str = "dog cat cat fish" should return false.
 *    pattern = "aaaa", str = "dog cat cat dog" should return false.
 *    pattern = "abba", str = "dog dog dog dog" should return false.
 *
 *  Notes:
 *  You may assume pattern contains only lowercase letters,
 *  and str contains lowercase letters separated by a single space.
 *
 */
public class WordPattern {
    
    //这个地方犯了两次错误,怎么就一直不改正呢
    //没有把key不同,value相同的情况排除掉  即没有排除:abab,dog dog dog dog这种情况
    public boolean wordPattern(String pattern, String str){
        if(pattern == null || str == null) return false;
        int lengthP = pattern.length();
        String[] strArray = str.split(" ");
        int lengthS =  strArray.length;
        if(lengthP == 0 || lengthS == 0 || lengthP != lengthS) return false;
        HashMap<Character,String> container =  new HashMap<Character,String>();
        for(int i=0;i<lengthP;i++){
            if(container.containsKey(pattern.charAt(i))){
                if(!container.get(pattern.charAt(i)).equals(strArray[i])){
                    return false;
                }
            }else{
                if(container.containsValue(strArray[i])){
                    return false;
                }else{
                    container.put(pattern.charAt(i), strArray[i]);
                }                
            }
        }    
        return true;
    }
    
    //大牛的算法,这里学习了index.put(key,value)的返回值,根据key来判断
    /*
     * 这是最原始的put的返回值的注释
     * the previous value associated with <tt>key</tt>, or
     *         <tt>null</tt> if there was no mapping for <tt>key</tt>.
     *         (A <tt>null</tt> return can also indicate that the map
     *         previously associated <tt>null</tt> with <tt>key</tt>,
     *         if the implementation supports <tt>null</tt> values.)
     *  大意是如果put的key值原来并不在map中,则返回null,如果key已经存在了,那么返回key值对应的前一个value值       
     *  用这种方法判断,key存放的pattern的每一个字符,与str的每一个单词,然后根据对应的位置value来判断是否是一一影射
     *     这里注意一下返回值是一个对象
     * */
    public boolean wordPatterns(String pattern, String str){
        String[] words = str.split(" ");
        if(words.length != pattern.length())
            return false;
        Map index = new HashMap();
        for(Integer i=0;i<words.length;i++){//这里一开始用int报错了
            if(index.put(pattern.charAt(i),i) != index.put(words[i],i))
                return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
        WordPattern word = new WordPattern();
        word.wordPatterns("abba", "dog dog cat cat");
    }
    
}

最新文章

  1. for循环与for in,$(&#39;&#39;).each 与$.each的区别
  2. Option
  3. CANopen DS301协议中文翻译V03版
  4. 强制类型转换(const_cast)
  5. 【Reporting Services 报表开发】— 数据表存储格式修改
  6. Codevs 1003 电话连线
  7. 다음에 적용될 Auto_increment 값 알아 내기 (计算下一个Auto_increment的值)
  8. PHP中截取中文乱码
  9. 数字信号处理Day2-小波基与规范正交化
  10. profile与bashrc
  11. XML文档的PHP程序查询代码
  12. 导航栏使用UIButton自定义返回按钮的图片
  13. [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。
  14. 【Unity】透明度渐变
  15. EDID:识别和解决常见问题指南
  16. git开发过程中的使用流程
  17. 转载Alpine Linux常用命令
  18. appium 使用环境安装配置记录
  19. HTML5 缓存
  20. 第 6 章 存储 - 044 - volume 生命周期管理

热门文章

  1. unity3D与网页的交互
  2. jboss 7 as1 日志配置
  3. object C—类中函数的调用
  4. Configuring Robolectric
  5. AIX系统上压缩与解压文件
  6. 关于NetworkInfo对象的isConnected()与isAvailable()
  7. Get file name without extension.
  8. Asp.net MVC利用Ajax.BeginForm实现bootstrap模态框弹出,并进行前段验证
  9. 在Mac OS上搭建本地服务器
  10. innerHTML/outerHTML; innerText/outerText; textContent