2019大厂面试题,据说90%的人当场没写对,30%写出思路得了部分分数

cn00439805 2019-10-29 10:34:03
需要在字符串y中寻找:含有字符串x所有字符的最短字符串

说明:
如果 y 中不存这样的最短字符串,则返回空字符串 ""。
如果 y 中存在这样的最短字符串,返回任意一个最短匹配。

例子:
输入: y = "dhs5goe13j45ddsfoea", x = "esd"
输出: "dsfoe"
...全文
652 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaskysun 2020-06-17
  • 打赏
  • 举报
回复
let y = "dhs5goe13j45ddsfoea"
let x = "esd"
let matches = {};
for (let i of x) {
	let rex = new RegExp(i, "g")
	let match;
	while (match = rex.exec(y)) {
		matches[match.index] = i
	}
}
let a = {}
let o = {}
let min = 999999999
let minstr
for (let i in matches) {
	a[i] = []
	o[i] = []
	for (let b in a) {
		if (a[b].length < x.length) {
			if (a[b].indexOf(matches[i]) == -1) {
				a[b].push(matches[i])
				o[b].push(i)
			}
		}
		if (a[b].length == x.length) {
			if (o[b][x.length - 1] - o[b][0] < min) {
				min = o[b][x.length - 1] - o[b][0]
				minstr = y.substr(o[b][0], min + 1) + ",位于" + o[b][0] + "-" + o[b][x.length - 1]
			}
		}
	}
}
alert(minstr)
cyc135565 2020-02-29
  • 打赏
  • 举报
回复
引用 34 楼 千千千本樱 的回复:
[quote=引用 33 楼 cyc135565 的回复:]
y = 'dhs5goe13j45ddsfoea'
x = 'esd'

seen = set(x)
for jj in range(len(y)): 
    seen.discard(y[jj]) 
    if len(seen) == 0: 
        break
i = 0
count = {}
ans = y
for j in range(len(y)): 
    count.setdefault(y[j], 0) 
    count[y[j]] += 1 
    while count[y[i]] > 1 or y[i] not in x: 
        count[y[i]] -= 1 
        i += 1 
    if j >= jj and j - i < len(ans): 
        ans = y[i:j + 1]
print(ans)
O(n) 复杂度 17楼的样例可以毫秒级出解
Traceback (most recent call last): File "C:/Users/Administrator/Desktop/aaa.py", line 15, in <module> while count[y[i]] > 1 or y[i] not in x: KeyError: 'b'[/quote]

y = 'dhs5goe13j45ddsfoea'
x = 'esd'
 
seen = set(x)
for jj in range(len(y)): 
    seen.discard(y[jj]) 
    if len(seen) == 0: 
        break
else:
    print("no answer")
i = 0
count = {}
ans = y
for j in range(len(y)): 
    count.setdefault(y[j], 0) 
    count[y[j]] += 1 
    while i <= j and (count[y[i]] > 1 or y[i] not in x): 
        count[y[i]] -= 1 
        i += 1 
    if j >= jj and j - i < len(ans): 
        ans = y[i:j + 1]
print(ans)
处理了越界情况
千千千本樱 2020-02-28
  • 打赏
  • 举报
回复
引用 33 楼 cyc135565 的回复:
y = 'dhs5goe13j45ddsfoea'
x = 'esd'

seen = set(x)
for jj in range(len(y)): 
    seen.discard(y[jj]) 
    if len(seen) == 0: 
        break
i = 0
count = {}
ans = y
for j in range(len(y)): 
    count.setdefault(y[j], 0) 
    count[y[j]] += 1 
    while count[y[i]] > 1 or y[i] not in x: 
        count[y[i]] -= 1 
        i += 1 
    if j >= jj and j - i < len(ans): 
        ans = y[i:j + 1]
print(ans)
O(n) 复杂度 17楼的样例可以毫秒级出解
Traceback (most recent call last): File "C:/Users/Administrator/Desktop/aaa.py", line 15, in <module> while count[y[i]] > 1 or y[i] not in x: KeyError: 'b'
cyc135565 2020-02-13
  • 打赏
  • 举报
回复
y = 'dhs5goe13j45ddsfoea'
x = 'esd'

seen = set(x)
for jj in range(len(y)): 
    seen.discard(y[jj]) 
    if len(seen) == 0: 
        break
i = 0
count = {}
ans = y
for j in range(len(y)): 
    count.setdefault(y[j], 0) 
    count[y[j]] += 1 
    while count[y[i]] > 1 or y[i] not in x: 
        count[y[i]] -= 1 
        i += 1 
    if j >= jj and j - i < len(ans): 
        ans = y[i:j + 1]
print(ans)
O(n) 复杂度 17楼的样例可以毫秒级出解
新邵陈某人 2019-11-06
  • 打赏
  • 举报
回复
我看了一眼所想到的,应该还有更好的。每个字符索引存入相应字符索引数组,然后直接比较索引相减相加最小的。
起风哥 2019-11-05
  • 打赏
  • 举报
回复
引用 30 楼 cn00439805 的回复:
y = "a" , x = "aa" 输出就是"" 'aa'是两个字符a组成的,y只有一个字符a,并不包含
题目的例子已经给了隐性条件是不重复的x了,不用纠结。
cn00439805 2019-11-05
  • 打赏
  • 举报
回复
y = "a" , x = "aa" 输出就是"" 'aa'是两个字符a组成的,y只有一个字符a,并不包含
起风哥 2019-11-05
  • 打赏
  • 举报
回复
引用 27 楼 天际的海浪 的回复:
[quote=引用 26 楼 a807719447 的回复:] [quote=引用 25 楼 cn00439805 的回复:] [quote=引用 24 楼 a807719447 的回复:] 还是把代码敲出来比较有说服力点,以下链接时解题过程和代码。你要求800ms 实际执行了150ms 应该满足你的要求。 https://blog.csdn.net/a807719447/article/details/102902924
抱歉,没接触过java,无法验证[/quote] 回头给你贴个js版本吧 还有 那个 x="aa" y=“a”这个输出 a 才是正确得,符合题题意得。[/quote] 他这个x="aa"的意思是匹配的子串中要包含两个a[/quote]举个例子数组升序排列如果包含两个1那,按这么理解题意我是不是需要理解成,下标小的排前面
起风哥 2019-11-05
  • 打赏
  • 举报
回复
引用 27 楼 天际的海浪 的回复:
[quote=引用 26 楼 a807719447 的回复:] [quote=引用 25 楼 cn00439805 的回复:] [quote=引用 24 楼 a807719447 的回复:] 还是把代码敲出来比较有说服力点,以下链接时解题过程和代码。你要求800ms 实际执行了150ms 应该满足你的要求。 https://blog.csdn.net/a807719447/article/details/102902924
抱歉,没接触过java,无法验证[/quote] 回头给你贴个js版本吧 还有 那个 x="aa" y=“a”这个输出 a 才是正确得,符合题题意得。[/quote] 他这个x="aa"的意思是匹配的子串中要包含两个a[/quote]这没道理,如果题目有明确要求需要包含两个a那么需要,如果没有明确要求,那我包含了就可以了,一般这种题目如果有特别要求,会明确出来的
天际的海浪 2019-11-05
  • 打赏
  • 举报
回复
引用 26 楼 a807719447 的回复:
[quote=引用 25 楼 cn00439805 的回复:] [quote=引用 24 楼 a807719447 的回复:] 还是把代码敲出来比较有说服力点,以下链接时解题过程和代码。你要求800ms 实际执行了150ms 应该满足你的要求。 https://blog.csdn.net/a807719447/article/details/102902924
抱歉,没接触过java,无法验证[/quote] 回头给你贴个js版本吧 还有 那个 x="aa" y=“a”这个输出 a 才是正确得,符合题题意得。[/quote] 他这个x="aa"的意思是匹配的子串中要包含两个a
起风哥 2019-11-05
  • 打赏
  • 举报
回复
引用 25 楼 cn00439805 的回复:
[quote=引用 24 楼 a807719447 的回复:] 还是把代码敲出来比较有说服力点,以下链接时解题过程和代码。你要求800ms 实际执行了150ms 应该满足你的要求。 https://blog.csdn.net/a807719447/article/details/102902924
抱歉,没接触过java,无法验证[/quote] 回头给你贴个js版本吧 还有 那个 x="aa" y=“a”这个输出 a 才是正确得,符合题题意得。
cn00439805 2019-11-05
  • 打赏
  • 举报
回复
引用 24 楼 a807719447 的回复:
还是把代码敲出来比较有说服力点,以下链接时解题过程和代码。你要求800ms 实际执行了150ms 应该满足你的要求。 https://blog.csdn.net/a807719447/article/details/102902924
抱歉,没接触过java,无法验证
cn00439805 2019-11-04
  • 打赏
  • 举报
回复
引用 20 楼 Logerlink 的回复:

<script>
console.log(new Date().getMilliseconds())
let x = 'esd',          //可写多个  个数越多执行越慢。。。
xArr = x.split('');
xsArr = permute([],xArr);
console.log(xsArr)
let matchs = [],
    str = 'dhs5goe13j45ddsfoea';
xsArr.forEach(item => {
    let regexStr = createRegex(item,x.length);
    let regex = eval(regexStr),
        match = str.match(regex);
        console.log(regexStr)
        matchs = matchs.concat(match)
});
matchs = matchs.filter(x=>{
    console.log(x)
    return x!=null && x.length >0
})
matchs = matchs.sort((a,b)=>a.length-b.length)
console.log(matchs)
console.log(matchs[0])
console.log(new Date().getMilliseconds())

/**
 * 根据提供的关键字符构建regex表达式
*/
function createRegex(item,len){
    let regex = '/'
    for(let i = 0;i<len -1;i++){
        regex +=`${item[i]}[^${item[i]}]*?`
    }
    regex += `${item[len-1]}/g`;
    return regex;
}

/**
 * 对提供的关键字符排序组合(网上找的)
 * 
*/
function permute(temArr,testArr){
   var permuteArr=[];
   var arr = testArr;
   function innerPermute(temArr){
         for(var i=0,len=arr.length; i<len; i++) {
             if(temArr.length == len - 1) {
                 if(temArr.indexOf(arr[i]) < 0) {
                     permuteArr.push(temArr.concat(arr[i]));
                 }
                 continue;
             }
             if(temArr.indexOf(arr[i]) < 0) {
                 innerPermute(temArr.concat(arr[i]));
             }
         }
     }
 innerPermute(temArr);
 return permuteArr;     
}
</script>
var y = "a", x = "aa"; 输出应该是"",而不是undefined
起风哥 2019-11-04
  • 打赏
  • 举报
回复
还是把代码敲出来比较有说服力点,以下链接时解题过程和代码。你要求800ms 实际执行了150ms 应该满足你的要求。 https://blog.csdn.net/a807719447/article/details/102902924
起风哥 2019-11-02
  • 打赏
  • 举报
回复
估算下来执行时间应该会在几十毫秒吧
起风哥 2019-11-02
  • 打赏
  • 举报
回复
这个反向思维可能速度更优,对x去重,将y所有的字符替换成.然后记录位置string本身就是个数组单次遍历这点数据没有威胁,接着取x去重的长度,去匹配y中所有符合长度的串,拿到一个集合去对照位置,具体代码就不写了
  • 打赏
  • 举报
回复
引用 2 楼 cn00439805的回复:
最终的输出 "dsfoe" 包含了X的"e","s","d"所有字母,所以"dsfoe"做为输出是对的,同时"dsfoe"是y里面包含X最短的。 比如"dhs5goe"也包含了X的"e","s","d"所有字母,但它不是最短的
简单易懂,谢谢!(凑字数)
Logerlink 2019-11-02
  • 打赏
  • 举报
回复

<script>
console.log(new Date().getMilliseconds())
let x = 'esd',          //可写多个  个数越多执行越慢。。。
xArr = x.split('');
xsArr = permute([],xArr);
console.log(xsArr)
let matchs = [],
    str = 'dhs5goe13j45ddsfoea';
xsArr.forEach(item => {
    let regexStr = createRegex(item,x.length);
    let regex = eval(regexStr),
        match = str.match(regex);
        console.log(regexStr)
        matchs = matchs.concat(match)
});
matchs = matchs.filter(x=>{
    console.log(x)
    return x!=null && x.length >0
})
matchs = matchs.sort((a,b)=>a.length-b.length)
console.log(matchs)
console.log(matchs[0])
console.log(new Date().getMilliseconds())

/**
 * 根据提供的关键字符构建regex表达式
*/
function createRegex(item,len){
    let regex = '/'
    for(let i = 0;i<len -1;i++){
        regex +=`${item[i]}[^${item[i]}]*?`
    }
    regex += `${item[len-1]}/g`;
    return regex;
}

/**
 * 对提供的关键字符排序组合(网上找的)
 * 
*/
function permute(temArr,testArr){
   var permuteArr=[];
   var arr = testArr;
   function innerPermute(temArr){
         for(var i=0,len=arr.length; i<len; i++) {
             if(temArr.length == len - 1) {
                 if(temArr.indexOf(arr[i]) < 0) {
                     permuteArr.push(temArr.concat(arr[i]));
                 }
                 continue;
             }
             if(temArr.indexOf(arr[i]) < 0) {
                 innerPermute(temArr.concat(arr[i]));
             }
         }
     }
 innerPermute(temArr);
 return permuteArr;     
}
</script>
cn00439805 2019-11-01
  • 打赏
  • 举报
回复
引用 16 楼 天际的海浪 的回复:

var y = "aa", x = "aa";
var str = "";
var rx = x.replace(/([\\\/\(\)\[\]\{\}\"\'\?\+\-\*\|\^\$\.])/g,"\\$1");
var arr = y.match(new RegExp(".*?["+rx+"]","g"))||[];
for (var i = 0; i < arr.length; i++) {
	var r = "";
	var t = x;
	for (var j = i; j < arr.length; j++) {
		r += j==i? arr[j].slice(-1) : arr[j];
		t = t.replace(arr[j].slice(-1),"");
		if (t.length==0) {
			if (str=="" || r.length<str.length)
				str = r;
			break;
		}
	}
}
alert(str);
做对了,就是性能不太理想,下面例子如果能控制在800毫秒间,就是完美

var y = "obzcopzocynyrsgsarijyxnkpnukkrvzuwdjldxndmnvevpgmxrmvfwkutwekrffnloyqnntbdohyfqndhzyoykiripdzwiojyoznbtogjyfpouuxvumtewmmnqnkadvzrvouqfbbdiqremqzgevkbhyoznacqwbhtrcjwfkzpdstpjswnpiqxjhywjanhdwavajrhwtwzlrqwmombxcaijzevbtcfsdcuovckoalcseaesmhrrizcjgxkbartdtotpsefsrjmvksqyahpijsrppdqpvmuocofuunonybjivbjviyftsyiicbzxnwnrmvlgkzticetyfcvqcbjvbufdxgcmesdqnowzpshuwcseenwjqhgsdlxatamysrohfnixfprdsljyyfhrnnjsagtuihuczilgvtfcjwgdhpbixlzmakebszxbhrdibpoxiwztshwczamwnninzmqrmpsviydkptjzpktksrortapgpxwojofxeasoyvyprjoguhqobehugwdvtzlenrcttuitsiijswpogicjolfxhiscjggzzissfcnxnvgftxvbfzkukqrtalvktdjsodmtgzqtuyaqvvrbuexgwqzwduixzrpnvegddyyywaquxjxrnuzlmyipuqotkghfkpknqinoidifnfyczzonxydtqroazxhjnrxfbmtlqcsfhshjrxwqvblovaouxwempdrrplefnxmwrwfjtebrfnfanvvmtbzjesctdgbsfnpxlwihalyiafincfcwgdfkvhebphtxukwgjgplrntsuchyjjuqozakiglangxkttsczhnswjksnuqwflmumpexxrznzwxurrysaokwxxqkrggytvsgkyfjrewrcvntomnoazmzycjrjrqemimyhriyxgrzcfuqtjhvjtuhwfzhwpljzajitrhryaqchnuawbxhxrpvyqcvhpggrpplhychyulijhkglinibedauhvdydkqszdbzfkzbvhldstocgydnbfjkcnkfxcyyfbzmmyojgzmasccaahpdnzproaxnexnkamwmkmwslksfpwirexxtymkmojztgmfhydvlqtddewjvsrmyqjrpycbmndhupmdqqabiuelacuvxnhxgtpvrtwfgzpcrbhhtikbcqpctlxszgpfbgcsbaaiapmtsucocmpecgixshrrnhyrpalralbccnxvjzjllarqhznzghswqsnfuyywmzbopyjyauknxddgdthlabjqtwxpxwljvoxkpjjpfvccyikbbrpdsyvlxscuoofkecwtnfkvcnzbxkeabtdusyhrqklhaqreupakxkfzxgawqfwsaboszvlshwzhosojjotgyagygguzntrouhiweuomqptfjjqsxlbylhwtpssdlltgubczxslqjgxuqnmpynnlwjgmebrpokxjnbiltvbebyytnnjlcwyzignmhedwqbfdepqakrelrdfesqrumptwwgifmmbepiktxavhuavlfaqxqhreznbvvlakzeoomykkzftthoemqwliednfsqcnbexbimrvkdhllcesrlhhjsspvfupxwdybablotibypmjutclgjurbmhztboqatrdwsomnxnmocvixxvfiqwmednahdqhxjkvcyhpxxdmzzuyyqdjibvmfkmonfxmohhshpkhmntnoplphqyprveyfsmsxjfosmicdsjrieeytpnbhlsziwxnpmgoxneqbnufhfwrjbqcsdfarybzwaplmxckkgclvwqdbpumsmqkswmjwnkuqbicykoisqwoootrdpdvcuiuswfqmrkctsgrevcxnyncmivsxbpbxzxpwchiwtkroqisnmrbmefbmatmdknaklpgpyqlsccgunaibsloyqpnsibwuowebomrmcegejozypjzjunjmeygozcjqbnrpakdermjcckartbcppmbtkhkmmtcngteigjnxxyzaibtdcwutkvpwezisskfaeljmxyjwykwglqlnofhycwuivdbnpintuyhtyqpwaoelgpbuwiuyeqhbvkqlsfgmeoheexbhnhutxvnvfjwlzfmvpcghiowocdsjcvqrdmkcizxnivbianfpsnzabxqecinhgfyjrjlbikrrgsbgfgyxtzzwwpayapfgueroncpxogouyrdgzdfucfrywtywjeefkvtzxlwmrniselyeodysirqflpduvibfdvedgcrzpzrunpadvawfsmmddqzaaahfxlifobffbyzqqbtlcpquedzjvykvarayfldvmkapjcfzfbmhscdwhciecsbdledspgpdtsteuafzbrjuvmsfrajtulwirzagiqjdiehefmfifocadxfuxrpsemavncdxuoaetjkavqicgndjkkfhbvbhjdcygfwcwyhpirrfjziqonbyxhibelinpllxsjzoiifscwzlyjdmwhnuovvugfhvquuleuzmehggdfubpzolgbhwyeqekzccuypaspozwuhbzbdqdtejuniuuyagackubauvriwneeqfhtwkocuipcelcfrcjcymcuktegiikyosumeioatfcxrheklookaqekljtvtdwhxsteajevpjviqzudnjnqbucnfvkybggaybebljwcstmktgnipdyrxbgewqczzkaxmeazpzbjsntltjwlmuclxirwytvxgvxscztryubtjweehapvxrguzzsatozzjytnamfyiitreyxmanhzeqwgpoikcjlokebksgkaqetverjegqgkicsyqcktmwjwakivtsxjwrgakphqincqrxqhzbcnxljzwturmsaklhnvyungjrxaonjqomdnxpnvihmwzphkyuhwqwdboabepmwgyatyrgtboiypxfavbjtrgwswyvcqhzwibpisydtmltbkydhznbsvxktyfxopwkxzbftzknnwipghuoijrbgqnzovxckvojvsqqraffwowfvqvfcmiicwitrhxdeombgesxexedlakitfovtydxunqnwqqdeeekiwjnwoshqcsljiicgobbbuqakjdonjawgjlezdnqhfdqnmsuavxdpnfzwipmspiabveaarshzwxmirgkmfncvtdrdvfxkpxlkdokxgtwcskmjryyymcthfnkasinihaunohkxaibtsqelockaefjmsuolebtnepauwmrxutspjwaxbmahsjtkfkxlnszribmeofbkyvbjscjtqjakuwvcgunvnonvqbbggfshauqsyznokqbhowjusypfnecffenojfvlblgzntqzlrgzprvhqnpfrrkzxznieiuivajivzijsqijigtatifmbplzqahuidegfoobpymkputzamzvweiyvvzlwihgmmmrcburbgbsdxrfjsbiylitghgcpqjbevvgypxcybubyoijijrhuzcdijfybqbfowlookqmlnplbxvjjosfqviygqyhgamuwzjklbyzopkrnhbywtfoqomweldmlrhjqswctubiknzzvcztyehouvnyiqnvkufaobehxhrjvtisxjlxoumipzjarwvbsaegdkpbsjmpevjbewzuqnfhoohhmdjgfpmjzdmtmykqvtucptwfidpwtwffzolffzqfdearclkyeecuzabjeqhxpmfodsvisnpxrqowdawheydfyhoexvcmihdlzavtqlshdhdgjzpozvvackebhgqppvcrvymljfvooauxcjnbejdivikcoaugxwzsulgfqdtefpehbrlhaoqxwcancuvbqutnfbuygoemditeagmcveatgaikwflozgdhkyfqmjcruyyuemwbqwxyyfiwnvlmbovlmccaoguieu"
var x = "cjgamyzjwxrgwedhsexosmswogckohesskteksqgrjonnrwhywxqkqmywqjlxnfrayykqotkzhxmbwvzstrcjfchvluvbaobymlrcgbbqaprwlsqglsrqvynitklvzmvlamqipryqjpmwhdcsxtkutyfoiqljfhxftnnjgmbpdplnuphuksoestuckgopnlwiyltezuwdmhsgzzajtrpnkkswsglhrjprxlvwftbtdtacvclotdcepuahcootzfkwqhtydwrgqrilwvbpadvpzwybmowluikmsfkvbebrxletigjjlealczoqnnejvowptikumnokysfjyoskvsxztnqhcwsamopfzablnrxokdxktrwqjvqfjimneenqvdxufahsshiemfofwlyiionrybfchuucxtyctixlpfrbngiltgtbwivujcyrwutwnuajcxwtfowuuefpnzqljnitpgkobfkqzkzdkwwpksjgzqvoplbzzjuqqgetlojnblslhpatjlzkbuathcuilqzdwfyhwkwxvpicgkxrxweaqevziriwhjzdqanmkljfatjifgaccefukavvsfrbqshhswtchfjkausgaukeapanswimbznstubmswqadckewemzbwdbogogcysfxhzreafwxxwczigwpuvqtathgkpkijqiqrzwugtr"
var timer1 = Date.now()
var str = "";
var rx = x.replace(/([\\\/\(\)\[\]\{\}\"\'\?\+\-\*\|\^\$\.])/g,"\\$1");
var arr = y.match(new RegExp(".*?["+rx+"]","g"))||[];
for (var i = 0; i < arr.length; i++) {
    var r = "";
    var t = x;
    for (var j = i; j < arr.length; j++) {
        r += j==i? arr[j].slice(-1) : arr[j];
        t = t.replace(arr[j].slice(-1),"");
        if (t.length==0) {
            if (str=="" || r.length<str.length)
                str = r;
            break;
        }
    }
}
console.log(str)
var timeDiff = Date.now() - timer1
console.log(timeDiff)
天际的海浪 2019-11-01
  • 打赏
  • 举报
回复

var y = "aa", x = "aa";
var str = "";
var rx = x.replace(/([\\\/\(\)\[\]\{\}\"\'\?\+\-\*\|\^\$\.])/g,"\\$1");
var arr = y.match(new RegExp(".*?["+rx+"]","g"))||[];
for (var i = 0; i < arr.length; i++) {
	var r = "";
	var t = x;
	for (var j = i; j < arr.length; j++) {
		r += j==i? arr[j].slice(-1) : arr[j];
		t = t.replace(arr[j].slice(-1),"");
		if (t.length==0) {
			if (str=="" || r.length<str.length)
				str = r;
			break;
		}
	}
}
alert(str);
加载更多回复(15)

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧