2

部分文字列の問題を繰り返し解決する方法を誰かに説明してもらえますか?

問題: 2 つの文字列S = S 1 S 2 S 3 …<em>S nおよびT = T 1 T 2 T 3 …<em>T mが与えられ、mがn以下である場合、TSの部分文字列。

4

11 に答える 11

4

文字列検索アルゴリズムのリストは次のとおりです

ニーズによっては、別のアルゴリズムの方が適している場合もありますが、Boyer-Mooreが一般的な選択肢です。

于 2009-09-02T20:06:46.447 に答える
3

使用している言語がわかりませんが、C#の例を次に示します。これはおおよそn2のアルゴリズムですが、作業は完了します。

bool IsSubstring (string s, string t)
{
   for (int i = 0; i <= (s.Length - t.Length); i++)
   {
      bool found = true;

      for (int j = 0; found && j < t.Length; j++)
      {
         if (s[i + j] != t[j])
             found = false;
      }

      if (found)
         return true;
   }

   return false;
}
于 2009-09-02T20:13:43.313 に答える
3

単純なアルゴリズムは、 S i + 1 Si + 2 …<em>Si + m = T 1 T2 <em>Tm場合、Sの位置0< i≤n -- mテストすることです。n =7およびm =5の場合:

i = 0:   S 1 S 2 S 3 S 4 S 5 S 6 S 7
      | | | | |
      T 1 T 2 T 3 T 4 T 5

i = 1:   S 1 S 2 S 3 S 4 S 5 S 6 S 7
        | | | | |
        T 1 T 2 T 3 T 4 T 5

i = 2:   S 1 S 2 S 3 S 4 S 5 S 6 S 7
          | | | | |
          T 1 T 2 T 3 T 4 T 5

擬似コードのアルゴリズム:

// we just need to test if n ≤ m 
IF n > m:
    // for each offset on that T can start to be substring of S
    FOR i FROM 0 TO n-m:
        // compare every character of T with the corresponding character in S plus the offset
        FOR j FROM 1 TO m:
            // if characters are equal
            IF S[i+j] == T[j]:
                // if we’re at the end of T, T is a substring of S
                IF j == m:
                    RETURN true;
                ENDIF;
            ELSE:
                BREAK;
            ENDIF;
        ENDFOR;
    ENDFOR;
ENDIF;
RETURN false;
于 2009-09-02T20:14:34.793 に答える
2
if (T == string.Empty) return true;
for (int i = 0; i <= S.Length - T.Length; i++) {
    for (int j = 0; j < T.Length; j++) {
        if (S[i + j] == T[j]) {
            if (j == (T.Length - 1)) return true;
        }
        else break;
    }
}
return false;
于 2009-09-02T20:09:54.413 に答える
1

次のようになります。

m==0? return true
cs=0
ct=0
loop
    cs>n-m? break
    char at cs+ct in S==char at ct in T?
    yes:
        ct=ct+1
        ct==m? return true
    no:
        ct=0
        cs=cs+1

end loop
return false
于 2009-09-02T20:09:03.417 に答える
1
// runs in best case O(n) where no match, worst case O(n2) where strings match

var s = "hippopotumus"
var t = "tum"

for(var i=0;i<s.length;i++)
    if(s[i]==t[0])
        for(var ii=i,iii=0; iii<t.length && i<s.length; ii++, iii++){
            if(s[ii]!=t[iii]) break
            else if (iii==t.length-1) console.log("yay found it at index: "+i)
        }
于 2012-09-24T20:36:40.073 に答える
0

O(n*m)アルゴリズムです。nm各文字列のサイズです。C# では、次のようになります。

   public static bool IsSubtring(char[] strBigger, char[] strSmall)
        {
            int startBigger = 0;
            while (startBigger <= strBigger.Length - strSmall.Length)
            {
                int i = startBigger, j = 0;

                while (j < strSmall.Length && strSmall[j] == strBigger[i])
                {
                    i++;
                    j++;
                }

                if (j == strSmall.Length)
                    return true;
                startBigger++;
            }

            return false;
        }
于 2013-10-08T16:49:46.467 に答える
0

これは、検索中に Needle が Haystacks の長さを超えていないことを確認するためのチェックを含む、私の PHP のバリエーションです。

<?php

function substring($haystack,$needle) {
        if("" == $needle) { return true; }
        echo "Haystack:\n$haystack\n";
    echo "Needle:\n$needle\n";

        for($i=0,$len=strlen($haystack);$i<$len;$i++){
                if($needle[0] == $haystack[$i]) {
                        $found = true;
                        for($j=0,$slen=strlen($needle);$j<$slen;$j++) {
                                if($j >= $len) { return false; }
                                if($needle[$j] != $haystack[$i+$j]) {
                                        $found = false;
                                        continue;
                                }
                        }
                        if($found) {
                                echo " . . . . . . SUCCESS!!!! startPos: $i\n";
                                return true;
                        }
                }
        }
        echo " . . . . . . FAILURE!\n" ;
        return false;
}

assert(substring("haystack","hay"));
assert(!substring("ack","hoy"));
assert(substring("hayhayhay","hayhay"));
assert(substring("mucho22","22"));
assert(!substring("str","string"));
?>

いくつかのエコーに残しました。彼らがあなたを怒らせたら削除してください!

于 2012-04-25T00:38:53.323 に答える
0

かなり古い投稿ですが、私はそれに答えようとしています。何か間違っている場合は、親切に修正してください。

package com.amaze.substring;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CheckSubstring {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Please enter the main string");
    String mainStr = br.readLine();

    System.out.println("Enter the substring that has to be searched");
    String subStr = br.readLine();

    char[] mainArr = new char[mainStr.length()];
    mainArr = mainStr.toCharArray();
    char[] subArr = new char[subStr.length()];
    subArr = subStr.toCharArray();
    boolean tracing = false;
    //System.out.println("Length of substring is "+subArr.length);
    int j = 0;

    for(int i=0; i<mainStr.length();i++){

        if(!tracing){
            if(mainArr[i] == subArr[j]){
                tracing = true;
                j++;
            }
        } else {
            if (mainArr[i] == subArr[j]){
                //System.out.println(mainArr[i]);
                //System.out.println(subArr[j]);
                j++;
                System.out.println("Value of j is "+j);
                if((j == subArr.length)){
                    System.out.println("SubString found");
                    return;
                }
            } else {
                j=0;
                tracing = false;
            }
        }
    }

    System.out.println("Substring not found");

}

}
于 2013-11-17T17:05:55.343 に答える