2013-07-27 2 views
2

안녕하세요 jquery에 대한 질문이, 주어진 배열에서 가장 긴 반복 된 하위 집합을 찾아야합니다.주어진 배열 배열 요소의 가장 긴 반복 된 하위 집합

예 :

my_array['b','r','o','w','n','f','o','x','h','u','n','t','e','r','n','f','o','x','r','y','h','u','n']

결과 nfox이어야한다. 다음 코드가 있습니다

string = my_array.join(''); 
for(i=0; i < my_array.length; i++) 
{ 

    for(j=0; j < my_array.length; j++) 
{ 

string.substring(Math.abs(j-i)); 
} 

} 

을하지만 난 어쩌면 내가 어떤 JQuery와 기능을 누락 원처럼이 작동하는 것 같다하지 않는 이유는 무엇입니까?

+4

을 가지고 당신이 그 코드를 찾을 것 어떻게 생각하세요 가장 긴 반복되는 부분 집합? 그것을 통해 우리에게 이야기하십시오. no-op (반환 값을 사용하지 않고'substring '을 호출)과 함께 중첩 된 루프가 있으며, 가장 긴 세그먼트 나 그와 같은 것을 추적하는 것도 없습니다. 최소 2 회 반복되는 이들 중에서 가장 긴 숫자가 –

+0

입니까? –

+2

그걸로 행운을 빌어 요! – putvande

답변

3

배열을 반복 한 다음 내부 루프에서 가능한 모든 하위 문자열 길이를 검색합니다. 최대 재현 하위 문자열은 배열 길이의 최대 절반에 불과할 수 있습니다.

indexOfindexLastOf 기능을 사용하면 다시 발생하는 하위 문자열을 검색 할 수 있습니다. 두 함수 모두 하위 문자열을 찾았고 발견 된 위치가 다른 경우 하위 문자열이 다시 발생했습니다.

my_array = ['b','r','o','w','n','f','o','x','h','u','n','t','e','r','n','f','o','x','r','y','h','u','n']; 
    str = my_array.join(''); 

    var greatestLen = 0; 
    var highestPosn1 = -1; 
    var highestPosn2 = -1; 

    for (var n = 0; n < my_array.length; ++n) 
    { 
     for (var l = 1; l <= my_array.length/2; ++l) 
     { 
      var subs = str.substr(n,l); 
      var find1 = str.indexOf(subs); 
      var find2 = str.lastIndexOf(subs); 
      if (find1 != -1 && find2 != -1 && find1 != find2) 
      { 
       var longestSubString = subs; 
       if (longestSubString.length > greatestLen) 
       { 
        highestPosn1 = find1; 
        highestPosn2 = find2; 
        greatestLen = longestSubString.length; 
       } 
      } 
     } 
    } 
    console.info('Longest substr ' + greatestLen + ' at posn1=' + highestPosn1 + ' and posn2=' + highestPosn2); 
+0

좋은 해결책입니다! –

+0

기술적으로 겹친 문자열을 계산하면 원래 길이의 절반보다 긴 부분 문자열을 가질 수 있습니다 (내 대답 참조). 짧은 (겹치지 않는) 부분 문자열의 경우 부분 문자열 길이가 0부터 시작하므로 메서드가 빠릅니다. 중첩이 허용되면, 하위 문자열 길이가 100 %부터 시작하기 때문에 광산이 빠릅니다. 물론 우리 알고리듬의 속도는 실제로 가장 길게 반복되는 부분 문자열이 ** 실제로는 **보다 많거나 적은 경우에 달려 있습니다. – Trojan

0

여기에 내가 PHP

function longest_subset ($input = array()) { 
$longestSubstring = ""; 
$inputString =implode("",$input); 
echo $inputString; 
if (!is_array($input)) { 
throw new InvalidArgumentException("Invalid Input Type", 1); 
} 
if (empty($input)) { 
throw new LengthException("Your array must contain one or more values", 1); 
} 

for($i=0; $i < strlen($inputString); $i++) { 
for($j=0; $j < strlen($inputString); $j++) { 
$length = abs($j-$i); 
echo $length.'<br>'; 

$substring = substr($inputString, $i, $length); 
//echo $substring.'<br>'; 

$doesSubstringRepeat = strrpos($inputString,$substring) > $i; 
$substringLongerThanLongest = strlen($substring) > strlen($longestSubstring); 

if ($doesSubstringRepeat && $substringLongerThanLongest) { 
$longestSubstring = $substring; 
} 
} 
} 

return strlen($longestSubstring) > 0 ? str_split($longestSubstring) : false; 
} 
0

In JavaScript와 함께 할 관리해야거야. 당신이 중복되는 문자열을 포함하는 경우 당신은 실제로 은 최대 절반 원래의 길이에 걸쳐 문자열을 반복 한 수 있습니다 문자열 "abababababab4는"문자열 인덱스 0에서 "ababababab"2

// For some fancy printing 
function post(string) { 
    document.getElementById("stati").innerHTML += string; 
} 

var myarray = ['b','r','o','w','n', 
       'f','o','x', 
       'h','u','n','t','e','r', 
       'n','f','o','x', 
       'r','y','h','u','n']; 
var string = myarray.join(""); 
var longestRepeated = ""; 

// i = current size of substring 
// i loop runs string.length times; 
// looks for large repeated substrings first 
for (i = string.length; i > 0; i--) { 
    post("<code>Searching all substrings of length " + i + "</code><br>"); 

    // j = current beginning index of substring 
    // j loop runs (string.length - substring.length + 1) times; 
    // checks for repeat of subStr in 
    // range (indexOf(subStr), whileCurrentSizeiStillFitsInString] 
    for (j = 0; j < string.length - i; j++) { 
     var subStr = string.substring(j, j + i); 
     post("<code class='a'>at index " + j + ", substring = '" + 
       subStr + "'</code><br>"); 

     // if subStr is matched between indexOf(subStr) + 1 and 
     // the end of the string, we're done here 
     // (I'm not checking for multiple repeated substrings 
     // of the same length. Get over it.) 
     if (string.indexOf(subStr, j + 1) != -1) { 
      longestRepeated = subStr; 
      break; 
     } 
    } 
    if (longestRepeated.length) break; 
} 

if (longestRepeated.length) alert("Longest repeated substring: " + 
            subStr); 
else alert("Longest repeated substring is the whole string.");