웹 프론트엔드 JS 튜토리얼 JavaScript에서 가장 큰 공통 부분 문자열을 찾는 방법

JavaScript에서 가장 큰 공통 부분 문자열을 찾는 방법

Jun 08, 2018 am 10:37 AM
javascript

이 글에서는 주로 자바스크립트의 문자열 순회, 일치, 연산 및 기타 관련 연산 기술을 포함하여 자바스크립트에서 최대 공통 부분 문자열을 구현하는 방법을 소개합니다. 도움이 필요한 친구들은 참고할 수 있습니다

이 글의 예는 JavaScript 하위 문자열 메서드의 최대 공통 하위 문자열입니다. 참고를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

가장 큰 공통 부분 문자열을 찾으려면 일반적인 방법은 행렬을 사용하는 것입니다. 문자열 abcdefg와 문자열 abcd가 있다고 가정하면 다음 표와 같은 행렬이 구성될 수 있습니다.

예, 전략을 변경해야 합니다. 항목이 일치하면 항목의 값이 다시 1로 설정되지만 대각선은 a[i-1, j-1](i > 1 && j > The ; 1)의 값은 +1이므로 1차원 배열만 사용할 수 있습니다. 두 문자열의 각 항목을 비교하여 일치하면 1, 일치하지 않으면 0이 됩니다. 그런 다음 가장 큰 공통 부분 문자열인 가장 긴 대각선이 1인 시퀀스를 찾습니다. 위의 분리를 보면 2차원 배열을 사용해야 할 것 같은데, 두 문자열이 모두 큰 경우에는 비용 효율성이 별로 높지 않습니다.

한 문자열을 "행"으로, 다른 문자열을 "열"로 사용하여 두 문자열의 각 항목 값을 비교하고 다른 변수를 사용하여 배열의 최대값과 시작 위치를 기록합니다. 끈. 코드는 다음과 같습니다.

function LCS(str1, str2) {
 if (str1 === "" || str2 === "") {
  return "";
 }
 var len1 = str1.length;
 var len2 = str2.length;
 var a = new Array(len1);
 var maxLen = 0;
 var maxPos = 0;
 for (var i = 0; i < len1; i++) { //行
  for (var j = len2 - 1; j >= 0; j--) {//列
   if (str1.charAt(j) == str2.charAt(i)) {
    if (i === 0 || j === 0) {
     a[j] = 1;
    } else {
     a[j] = a[j - 1] + 1;
    }
   } else {
    a[j] = 0;
   }
   if (a[j] > maxLen) {
    maxLen = a[j];
    maxPos = j;
   }
  }
 }
 return str1.substr(maxPos - maxLen + 1, maxLen);
}
로그인 후 복사

그런데 코드가 실제로 최적이 아닌 이유는 무엇입니까? 위의 작성 방법은 두 루프 레이어가 모두 완료될 때까지 기다려야 하기 때문입니다. 상대적으로 더 빠른 방법이 있습니까?

길이가 각각 len1과 len2인 문자열 a와 b가 있다고 가정합니다. 해당 문자열의 공통 부분 문자열은 <= Math.min(len1, len2)이어야 하고 부분 문자열은 연속적이어야 하며 a와 b에 속해야 합니다.

function findMaxSubStr(s1,s2){
 var str= &quot;&quot;,
  L1=s1.length,
  L2=s2.length;
 if (L1&gt;L2){
  var s3=s1;
  s1=s2;
  s2=s3;
  s3 = null;
  L1=s2.length;
  L2 = s1.length;
 }
 for (var i=L1; i &gt; 0; i--) {
  for (var j= 0; j &lt;= L2 - i &amp;&amp; j &lt; L1; j++){
   str = s1.substr(j, i);
   if (s2.indexOf(str) &gt;= 0) {
    return str;
   }
  }
 }
 return &quot;&quot;;
}
로그인 후 복사

먼저 s1과 s2의 길이를 비교한 다음 더 짧은 문자열을 선택하세요. substr(idex, len), 더 짧은 문자열을 가져와 해당 하위 문자열을 가져온 다음, 더 긴 문자열에 해당 문자열이 있는지 확인하고, 존재하면 직접 반환하고, 그렇지 않으면 다음 숫자를 삭제하세요.

완전한 예:

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
 &lt;head&gt;
 &lt;title&gt;www.jb51.net&lt;/title&gt;
 &lt;style type=&#39;text/css&#39;&gt;
 body {background-color:#fff;}
 &lt;/style&gt;
 &lt;/head&gt;
 &lt;body&gt;
&lt;script type=&#39;text/javascript&#39;&gt;
function LCS(str1, str2) {
 if (str1 === &quot;&quot; || str2 === &quot;&quot;) {
 return &quot;&quot;;
 }
 var len1 = str1.length;
 var len2 = str2.length;
 var a = new Array(len1);
 var maxLen = 0;
 var maxPos = 0;
 for (var i = 0; i &lt; len1; i++) { //行
 for (var j = len2 - 1; j &gt;= 0; j--) {//列
 if (str1.charAt(j) == str2.charAt(i)) {
 if (i === 0 || j === 0) {
  a[j] = 1;
 } else {
  a[j] = a[j - 1] + 1;
 }
 } else {
 a[j] = 0;
 }
 if (a[j] &gt; maxLen) {
 maxLen = a[j];
 maxPos = j;
 }
 }
 }
 return str1.substr(maxPos - maxLen + 1, maxLen);
}
function findMaxSubStr(s1,s2){
 var str= &quot;&quot;,
 L1=s1.length,
 L2=s2.length;
 if (L1&gt;L2) {
 var s3=s1;
 s1=s2;
 s2=s3;
 s3 = null;
 L1=s2.length;
 L2 = s1.length;
 }
 for (var i=L1; i &gt; 0; i--) {
 for (var j= 0; j &lt;= L2 - i &amp;&amp; j &lt; L1; j++){
   str = s1.substr(j, i);
   if (s2.indexOf(str) &gt;= 0) {
 return str;
  }
  }
 }
 return &quot;&quot;;
}
 !(function() {
 var tmpArr = [];
 for (var i = 97; i &lt; 97 + 26; i++) {
 tmpArr.push(String.fromCharCode(i));
 }
 var s2 = tmpArr.join(&quot;&quot;);
 tmpArr.sort(function() {return Math.random() &gt; 0.7;});
 var s1 = new Array(600).join(tmpArr.join(&quot;&quot;));
 var date = getNow();
 alert( &quot;消耗时间:&quot; + (getNow() - date) + &quot;秒 &quot; + LCS(s1, s2));
 date = getNow();
 alert( &quot;消耗时间:&quot; + (getNow() - date) + &quot;秒 &quot; + findMaxSubStr(s1, s2) );
 })();
function getNow() {
 return new Date().getTime();
}
&lt;/script&gt;
 &lt;/body&gt;
&lt;/html&gt;
로그인 후 복사

위 내용은 제가 모든 사람을 위해 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

관련 기사:

vue.js에서 Nginx를 사용하여 도메인 간 문제 해결

vue.js에서 Nginx를 사용하여 도메인 간 문제 해결

vue+webpack에서 비동기 구성 요소 로딩을 구현하는 방법 ?

위 내용은 JavaScript에서 가장 큰 공통 부분 문자열을 찾는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 Dec 17, 2023 pm 02:54 PM

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 Dec 17, 2023 am 09:39 AM

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 Dec 17, 2023 pm 12:09 PM

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법

자바스크립트에서 insertBefore를 사용하는 방법 자바스크립트에서 insertBefore를 사용하는 방법 Nov 24, 2023 am 11:56 AM

자바스크립트에서 insertBefore를 사용하는 방법

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 Jan 05, 2024 pm 01:37 PM

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법

See all articles