var y = "dhs5goe13j45ddsfoea", x = "esd";
var str = "";
var arr = y.match(new RegExp("[^"+x+"]*["+x+"]","g"));
for (var i = 0; i < arr.length; i++) {
var r = arr[i].slice(-1);
var set = new Set();
set.add(r);
for (var j = i+1; j < arr.length; j++) {
r += arr[j];
set.add(arr[j].slice(-1));
if (set.size==x.length) {
if (str=="" || r.length<str.length)
str = r;
break;
}
}
}
alert(str);
uj5u.com熱心網友回復:
var y = "a", x = "b";
//拋錯 Uncaught TypeError: Cannot read property 'length' of null
uj5u.com熱心網友回復:
var arr = y.match(new RegExp("[^"+x+"]*["+x+"]","g"))||[];
uj5u.com熱心網友回復:
var y = "a", x = "a";
輸出應該是a,而不是""
uj5u.com熱心網友回復:
var y = "a", x = "a";
var str = "";
var arr = y.match(new RegExp("[^"+x+"]*["+x+"]","g"))||[];
for (var i = 0; i < arr.length; i++) {
var r = "";
var set = new Set();
for (var j = i; j < arr.length; j++) {
r += j==i? arr[j].slice(-1) : arr[j];
set.add(arr[j].slice(-1));
if (set.size==x.length) {
if (str=="" || r.length<str.length)
str = r;
break;
}
}
}
alert(str);
uj5u.com熱心網友回復:
var y = "a", x = "a";
var str = "";
var arr = y.match(new RegExp("[^"+x+"]*["+x+"]","g"))||[];
for (var i = 0; i < arr.length; i++) {
var r = "";
var set = new Set();
for (var j = i; j < arr.length; j++) {
r += j==i? arr[j].slice(-1) : arr[j];
set.add(arr[j].slice(-1));
if (set.size==x.length) {
if (str=="" || r.length<str.length)
str = r;
break;
}
}
}
alert(str);
var y = "aa", x = "aa";
輸出應該是aa,而不是""
uj5u.com熱心網友回復:
function test(y, x) {
var pos = {}, temp = [], min = { start: 0, end: 0, len: y.length };
//去重復字符,轉物件
x.split('').forEach(function (s) { pos[s] = [] });
//獲取各個匹配字符的位置
for (var k in pos) {
var index = y.indexOf(k, 0);
//如果某個字符不能匹配則提示并退出
if (index == -1) {
alert('不能匹配字符' + k);
return '';
}
while (index > -1) {
pos[k].push(index);
index = y.indexOf(k, index + 1);
}
}
//生成組合
for (var k in pos) {
if (temp.length == 0) {
pos[k].forEach(function (n) { temp.push([n]); });
} else {
var temp2 = [];
temp.forEach(function (arr) {
pos[k].forEach(function (n) {
temp2.push(arr.concat([n]));
});
});
temp = temp2;
}
}
//計算最小長度字串
temp.forEach(function (arr) {
arr.sort(function (a, b) { return a - b });
var _ = { start: arr[0], end: arr[arr.length - 1], len: arr[arr.length - 1] - arr[0] };
if (_.len < min.len) {
min = _;
}
});
return y.substring(min.start, min.end + 1);
}
var result = test('dhs5goe13j45ddsfoea', 'esdssddddeee');
alert(result);
uj5u.com熱心網友回復:
var y = "aa", x = "aa";
輸出應該是aa,而不是""
x中的字符可以重復的嗎?
uj5u.com熱心網友回復:
包含的字符應該是去除重復字符的,因為位置不要求,如果不去除重復字符怎么計算?
uj5u.com熱心網友回復:
function test(y, x) {
var pos = {}, temp = [], min = { start: 0, end: 0, len: y.length };
//去重復字符,轉物件
x.split('').forEach(function (s) { pos[s] = [] });
//獲取各個匹配字符的位置
for (var k in pos) {
var index = y.indexOf(k, 0);
//如果某個字符不能匹配則提示并退出
if (index == -1) {
alert('不能匹配字符' + k);
return '';
}
while (index > -1) {
pos[k].push(index);
index = y.indexOf(k, index + 1);
}
}
//生成組合
for (var k in pos) {
if (temp.length == 0) {
pos[k].forEach(function (n) { temp.push([n]); });
} else {
var temp2 = [];
temp.forEach(function (arr) {
pos[k].forEach(function (n) {
temp2.push(arr.concat([n]));
});
});
temp = temp2;
}
}
//計算最小長度字串
temp.forEach(function (arr) {
arr.sort(function (a, b) { return a - b });
var _ = { start: arr[0], end: arr[arr.length - 1], len: arr[arr.length - 1] - arr[0] };
if (_.len < min.len) {
min = _;
}
});
return y.substring(min.start, min.end + 1);
}
var result = test('dhs5goe13j45ddsfoea', 'esdssddddeee');
alert(result);
var y = "a", x = "aa";
輸出應該是"",而不是"a"
uj5u.com熱心網友回復:
var y = "aa", x = "aa";
輸出應該是aa,而不是""
x中的字符可以重復的嗎?
題無禁止即自由,所以可以重復
uj5u.com熱心網友回復:
既然是把x拆開來一個一個判斷,為什么aa不能匹配為a呢?a明顯比aa要短
uj5u.com熱心網友回復:
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);
uj5u.com熱心網友回復:
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)
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樓的樣例可以毫秒級出解
uj5u.com熱心網友回復:
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'
uj5u.com熱心網友回復:
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'
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)
處理了越界情況
uj5u.com熱心網友回復:
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)