要回国了,写个简单的总结吧。

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投
内推多家公司面试
坐标湾区
Games Startup
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
把贵司招聘信息放这里
系统
30秒前
系统
3分钟前
系统
4分钟前
系统
7分钟前
系统
7分钟前
系统
7分钟前
系统
9分钟前
全站
9分钟前
系统
9分钟前
系统
12分钟前
系统
13分钟前
系统
13分钟前
系统
14分钟前
系统
14分钟前
全站
Warald 说: MemorialDay大礼包之二:【新功能】论坛开启用户全局威望值,每楼右上方均可投票。
41分钟前
全站
Warald 说: MemorialDay大礼包之一:【新功能】发帖后,可以邀请朋友参与讨论(自动功能)
48分钟前
查看: 4132|回复: 6
收起左侧

[Leetcode] 请教一题Substring with Concatenation of All Words

[复制链接] |试试Instant~ |关注本帖
我的人缘0
wendychueng 发表于 2014-6-23 15:53:28 | 显示全部楼层 |阅读模式
  此人很可信:
 
0% (暂未有人投票) 【我投】
  此人瞎逼逼:
 
0% (暂未有人投票) 【我投】

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
本帖最后由 wendychueng 于 2014-6-23 02:56 编辑

Substring with Concatenation of All Words

You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.
For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]
You should return the indices: [0,9].
(order does not matter).


这个是discuss里面一个人写的算法,看不太懂中间那个if... else if... else... 有没有同学可以解释一下? 谢谢!

//use hash table to store the list of words L
//for each m char in the string, check if it is a valid word

class Solution {
public:
    vector<int> findSubstring(string S, vector<string> &L) {
        vector<int> result;
        map<string, int> cntL;
        map<string, int> cn;
        int n = S.length();
        int wordlen = L[0].length();
        int listsize = L.size();
        int count = 0;    // number of words in the list
        //store the list of words in hash table
        for(int i=0; i<listsize; i++)
        {
            //if this key has not been occupied
            if(cn.count(L) == 0)
        
    {
                cn[L] = 1;
                count++;
            }
            else
            {
                cn[L] += 1;
                count++;
            }
        }

        string tr, du;
        int r = 0;
        int st = 0;

        for(int j=0; j<wordlen; j++)   //for each char in a word
        { r = 0; st = j;
          for(int i=j; i<n; i += wordlen)  //check the string for every word length substring
          {
              tr = S.substr(i, wordlen);  //copy the next m char in the string
              if(cn.count(tr) == 0 || cn[tr] == 0)  //?? if this is not a valid word
              {
                  cntL.clear();
                  r = 0;
                  st = i+wordlen;
              }
              else if(cntL[tr] < cn[tr]) // ???
              {
                  cntL[tr] += 1;
                  r++;
              }
              else
              {
                  du = S.substr(st, wordlen);
                  while(du != tr)
                  {
                      cntL[du]--;
                      r--;
                      st += wordlen;
                      du = S.substr(st, wordlen);
                  }
                  st += wordlen;
              }
              if(r == count)   //if r == count meaning all the words have appeared
              {
                  result.push_back(st);
                  du = S.substr(st, wordlen);
                  cntL[du]--;
                  r--;
                  st += wordlen;
              }
          }
          cntL.clear();
        }
        sort(result.begin(), result.end());
        return result;
    }
};


上一篇:【第三轮】6.23-6.29 CareerCup 2.6
下一篇:如何计算空间复杂度?
我的人缘0
 楼主| wendychueng 发表于 2014-6-24 02:27:53 | 显示全部楼层
  此人很可信:
 
0% (暂未有人投票) 【我投】
  此人瞎逼逼:
 
0% (暂未有人投票) 【我投】
做过这题的同学来说一下思路也行啊
回复 支持 反对

使用道具 举报

全球28万学生4.7分推荐
我的人缘0
 楼主| wendychueng 发表于 2014-6-27 04:15:33 | 显示全部楼层
  此人很可信:
 
0% (暂未有人投票) 【我投】
  此人瞎逼逼:
 
0% (暂未有人投票) 【我投】
做过这题的同学来说一下思路吧
回复 支持 反对

使用道具 举报

我的人缘0
wizard19900509 发表于 2014-6-28 00:17:30 | 显示全部楼层
  此人很可信:
 
0% (暂未有人投票) 【我投】
  此人瞎逼逼:
 
0% (暂未有人投票) 【我投】
这题基本就是暴力解吧
用L里面的词建一个字典 c++就是map 记录每个出现的词以及出现几次 然后遍历字符串所有可能的起点 每个起点扫一遍 一旦发现不在字典中的词或者出现频率超过字典里的值 就退出进行下一个循环即可
回复 支持 反对

使用道具 举报

我的人缘0
readman 发表于 2014-6-28 01:12:04 | 显示全部楼层
  此人很可信:
 
0% (暂未有人投票) 【我投】
  此人瞎逼逼:
 
0% (暂未有人投票) 【我投】
本帖最后由 readman 于 2014-6-28 01:13 编辑

这题我做的方法和以上不太一样.
我把L排序, 然后在一个loop中用L的长度扫S. 每次用boyer moore看L里的字串是不是substring, 不过复杂度好高..O(outer loop) * O(n+m) bm
回复 支持 反对

使用道具 举报

我的人缘0
xiaobenben 发表于 2015-1-21 13:48:51 | 显示全部楼层
不太明白题意,有人能解释下不?
回复 支持 反对

使用道具 举报

我的人缘0
Sayings 发表于 2016-7-20 11:35:35 | 显示全部楼层
  此人很可信:
 
0% (暂未有人投票) 【我投】
  此人瞎逼逼:
 
0% (暂未有人投票) 【我投】
wizard19900509 发表于 2014-6-28 00:17
这题基本就是暴力解吧
用L里面的词建一个字典 c++就是map 记录每个出现的词以及出现几次 然后遍历字符串所 ...

暴力解现在超时了
回复 支持 反对

使用道具 举报

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2018-5-27 13:45

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表