2016-10-17 8 views
1

Моя функция пытается проверить, содержит ли строка подстроку без использования indexOf или regex match или любых стандартных методов JS.Убедитесь, что строка содержит подстроку без использования indexOf - Javascript

Пожалуйста, проверьте этот jsfiddle: https://jsfiddle.net/09x4Lpj2/

var string1 = 'applegate'; 
 
    var string2 = 'gate'; 
 

 
    function containsString(string1, string2){ 
 
\t var j = 0; 
 
     var k = 0; 
 
     var contains = 'false'; 
 
     var charArray1 = string1.split(''); 
 
     var charArray2 = string2.split(''); 
 
    
 
     for(var i = 0; i < charArray2.length; i++){ 
 
    \t  j = i; 
 
     if(charArray1[j++] != charArray2[k++]){ 
 
    \t contains = 'false'; 
 
     }else{ 
 
    \t contains = 'true'; 
 
     } 
 
     } 
 
    
 
    console.log(contains); 
 
    } 
 
containsString(string1, string2);

Это решение работает только тогда, когда индексы одинаковы между двумя строками (например applegate и apple.). Но не будет работать, если индексы не совпадают (например, applegate и gate). Как правильно управлять итерационными значениями, чтобы функция возвращала значение true для обеих ситуаций?

+4

https://en.wikipedia.org/wiki/String_searching_algorithm – Ryan

+0

там не нужно преобразовать строку в массив символов. string уже char array –

+0

Два для циклов, вложенных. – Nayuki

ответ

2

вы можете попробовать этот измененный сценарий вашей. https://jsfiddle.net/ebs38rfh/

var string1 = 'applegate'; 
var string2 = 'gate'; 

function containsString(string1, string2){ 
    var charArray1 = string1.split(''); 
    var charArray2 = string2.split(''); 
    var match = 0; 

    for(var i = 0; i < charArray1.length - charArray2.length + 1; i++){ 
    match = 0; 
    for(var j = 0; j < charArray2.length; j++){ 
     if(charArray1[i+j] == charArray2[j]){ 
     match++; 
     } 
     console.log(i, j, match, charArray1[i+j], charArray2[j]); 
     if(match == charArray2.length){ 
     return true; 
     } 
    } 
    } 
    return false; 
} 

console.log(containsString(string1, string2)); 
+0

Спасибо. Это очень полезно. Особенно для сред, которые не поддерживают метод indexOf, такой как IE <9 и т. Д. ... – ameliapond

1

Добро пожаловать в SO. Regex может быть использован .. Если даже это не также запрещено ..

function containsString(string1, string2){ 
    console.log(string1.match(string2) != null ? "Yes" : "No"); 
} 

Regex

+1

спасибо за альтернативное решение :) Однако я стараюсь избегать регулярных выражений 'match' или любых других методов, чтобы я мог разработать алгоритм для такого типа ситуаций. – qollers

+0

Это не сработает, если 'string2' содержит метасимволы регулярных выражений типа'. * []() ' – Nayuki

+0

Я согласился. Но, видимо, Regex не может быть и речи. Этого не может быть ответ .. просто отправная точка. :) – Searching

0

Этот код имеет логическую задачу, только чтобы определить, является ли последний символ A равен соответствующему характеру B, Может быть, следующий код, что вы хотите, добавьте строку кода.

var string1 = 'applegate'; 
var string2 = 'gate'; 

function containsString(string1, string2){ 
    var j = 0; 
    var k = 0; 
    var contains = 'false'; 
    var charArray1 = string1.split(''); 
    var charArray2 = string2.split(''); 

    for(var i = 0; i < charArray2.length; i++){ 
    j = i; 
    if(charArray1[j++] != charArray2[k++]){ 
     contains = 'false'; 
     break; 
    }else{ 
     contains = 'true'; 
    } 
    } 

console.log(contains); 
} 
Смежные вопросы