2016-03-29 2 views
0

Я пытаюсь проверить, содержит ли строка b любую 5-значную подстроку a.Проверка, если подстрока длиной 5 находится в другой строке (рефакторинг)

Это работает, но немного грязный:

var a = "1eabcde"; 
var b = "12abcde12fg"; 

    for(var i=0; i<a.length; i++){ 
     for(var j=i;j<a.length-i;j++){ 
      if(a.charAt(j) == b.charAt(i) && a.charAt(j+1) == b.charAt(i+1) && a.charAt(j+2) == b.charAt(i+2) && a.charAt(j+3) == b.charAt(i+3) && a.charAt(j+4) == b.charAt(i+4)){ 
       alert("ya"); 
      }        
     } 
    } 

Есть ли другие чистые варианты?

+0

Я немного запутался, должен ли быть результат, если 1, e, a, b, c, d, e во второй строке независимо от порядка? – user2879041

+0

извините, что это должно быть, если 5 символов присутствуют в том же порядке, позвольте мне отредактировать * – codemonkey

+0

Вы имеете в виду «if string a» not b – yeya

ответ

2

Вы можете использовать substring и indexOf:

var a = "1eabcde"; 
var b = "12abcde12fg"; 

for (var i = 0; i <= a.length - 5; i++) { 
    if (b.indexOf(a.substring(i, i + 5)) >= 0) { 
     alert("ya"); 
    } 
} 

(.. Вы можете использовать a.substr(i, 5) вместо a.substring(i, i + 5) Эти два вызова ведут себя одинаково)

Обратите внимание, что если вы цикл от 0 до a.length (как в ваш исходный код), то все суффиксы a длиной 5 или менее будут найдены в b.

В одном отношении этот код не ведет себя так же, как ваш оригинал: он будет предупреждать только один раз для каждой подстроки a, независимо от того, сколько раз эта конкретная подстрока может возникнуть в b. Таким образом, если a = 'abcde' и b = '01abcde23abcde45, ваш исходный код выведет два предупреждения (по одному для каждого вхождения 'abcde'), тогда как вышеописанное будет только оповещать один раз. Если вы хотите оригинальное поведение, изменить if к while так:

for (var i = 0; i <= a.length - 5; i++) { 
    var j = -1; 
    while ((j = b.substring(j+1).indexOf(a.substr(i, 5))) >= 0) { 
     alert("ya"); 
    } 
} 
1

Это чистейшая подход:

var a = "1eabcde"; 
 
var b = "12abcde12fg"; 
 

 
for (var i = 0; i <= a.length - 5; i++) { 
 
    if(b.indexOf(a.substr(i, 5)) > -1) { 
 
     alert("ya"); 
 
    } 
 
}

+0

необходимо сопоставить 5 символов не один – codemonkey

+0

@codemonkey: нужно сопоставить 5 символов индивидуально или в целом? Что [** 'b.indexOf (a)! == -1' **] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf) делает , проверяет, является ли 'a' подстрокой' b'. –

+0

Исходный код OP (исключая конечные эффекты) ищет любые пять последовательных символов 'a' в' b'. –

Смежные вопросы