zoukankan      html  css  js  c++  java
  • Substring with Concatenation of All Words

    Substring with Concatenation of All Words

    问题:

    You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in wordsexactly once and without any intervening characters.

    思路:

      Hashtable + string API

    我的代码:

    import java.util.Hashtable;
    
    public class Solution {
        public List<Integer> findSubstring(String s, String[] words) {
            List<Integer> rst = new ArrayList<Integer>();
            if(s==null || s.length()==0 || words==null || words.length==0)  return rst;
            int wordLen = words[0].length();
            int count = words.length;
            Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
            for(String word: words)
            {
                if(ht.containsKey(word)) ht.put(word, ht.get(word)+1);
                else ht.put(word,1);    
            }
            for(int i=0; i<=s.length()-count*wordLen; i++)
            {
                String sub = s.substring(i,i+count*wordLen);
                if(isValid(sub, ht, i, wordLen)) rst.add(i);
            }
            return rst;
        }
        public boolean isValid(String sub, Hashtable<String,Integer> ht, int start, int wordLen)
        {
            Hashtable<String,Integer> found = new Hashtable<String,Integer>();
            for(int i=0; i<=sub.length()-wordLen; i+=wordLen)
            {
                String key = sub.substring(i,i+wordLen);
                if(ht.containsKey(key))
                {
                    if(found.containsKey(key))
                    {
                        found.put(key,found.get(key)+1);
                        if(found.get(key) > ht.get(key))    return false;
                    }
                    else found.put(key,1);
                }
                else return false;
            }
            return true;
        }
    }
    View Code

    学习之处:

    • String[] words可以包含重复的word,此处不适宜用Hashtable了,之前在微软的在线笔试中碰到了相应的问题,忘记考虑可以包含重复的元素了,丢了一些分数。
    • 既然包含重复的元素,怎么用hashtable进行存储呢,value解决方法有两个,一个是用List标记每一个重复的元素,另外一个使用count表明有几个重复的元素,第一种方式太过于复杂了,采用第二种方法,通过两个hashtable比较次数,判断是否由相应的word
    • 这道题是竟然暴力解法也能解决,注意命名规范
    • 改变不好的习惯 坏习惯+1
  • 相关阅读:
    通过队列实现进程间的通信(使用阻塞方式调用func函数)
    Scrapy 项目:QuotesBot
    数据分析_找数据参考网站
    Matplotlib 图表绘制工具学习笔记
    Python算法_斐波那契数列(10)
    Python算法_排序数组(09)
    Python数据结构与算法_反转字符串(08)
    Python算法_爬楼梯(08)
    Python数据结构与算法_搜索插入位置(07)
    Python数据结构与算法_删除排序数组中的重复项(06)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4490536.html
Copyright © 2011-2022 走看看