Python
 Computer >> コンピューター >  >> プログラミング >> Python

文字列のサブ文字列が別の文字列と完全に一致するか、Pythonの1つの位置で異なるインデックスを見つけるようにプログラムします


2つの文字列が提供されているとします。最初の文字列の長さは2番目の文字列よりも長いため、最初の文字列の部分文字列が2番目の文字列と正確に一致するか、1つの位置が異なるかを確認する必要があります。最初の文字列のインデックスを返します。ここで、2番目の文字列と一致する可能性のあるサブ文字列が始まります。

したがって、入力がstring1 ='tpoint'、string2 ='pi'の場合、出力は12になります。

2番目の文字列と一致するか、インデックス1と2の1つの位置が異なる最初の文字列の部分文字列は、「po」と「oi」です。

これを解決するには、次の手順に従います-

  • 関数search()を定義します。これにはstring1、string2
      が必要です
    • str_cat:=string1 + string2
    • z_list:=0で初期化されたstr_catのサイズの新しいリスト
    • z_list [0]:=str_catのサイズ
    • 右:=0
    • 左:=0
    • 範囲1からstr_catのサイズのiの場合は、
      • i>が正しければ、
        • j:=0
        • j +i
        • j:=j + 1
      • z_list [i]:=j
      • j> 0の場合、
        • 左:=i
        • 右:=i + j-1
    • それ以外の場合、
      • k:=i-左
      • r_len:=right --i + 1
      • z_list [k]
      • z_list [i]:=z_list [k]
    • それ以外の場合、
      • m:=右+ 1
      • m
      • m:=m + 1
      • z_list [i]:=m-i
      • 左:=i
      • 右:=m-1
  • z_list [i]:=string1の最小サイズ、z_list [i]
  • returnz_list[string1のインデックスサイズから終了まで]
  • fwd:=search(str2、str1)
  • bwrd:=search(str2 [インデックス0から終了]、str1 [インデックス0から終了])
  • リストbwrdを逆にする
  • idx:=新しいリスト
  • 0からstr1のサイズまでの範囲のiの場合-(str2 + 1のサイズ)、do
    • if fwd [i] + bwrd [i +(str2 -1のサイズ)]> =str2-1のサイズthen
      • idxの最後にiの文字列表現を挿入します
  • idxのサイズが0と同じ場合、
    • Falseを返す
  • それ以外の場合、
    • idxの文字列表現
  • 理解を深めるために、次の実装を見てみましょう-

    def search(string1, string2):
       str_cat = string1 + string2
       z_list = [0] * len(str_cat)
       z_list[0] = len(str_cat)
       right = 0
       left = 0
       for i in range(1, len(str_cat)):
          if i > right:
             j = 0
             while j + i < len(str_cat) and str_cat[j] == str_cat[j+i]:
                j += 1
             z_list[i] = j
             if j > 0:
                left = i
                right = i + j - 1
          else:
             k = i - left
             r_len = right - i + 1
             if z_list[k] < r_len:
                z_list[i] = z_list[k]
             else:
                m = right + 1
                while m < len(str_cat) and str_cat[m] == str_cat[m -i]:
                   m += 1
                z_list[i] = m - i
                left = i
                right = m - 1
          z_list[i] = min(len(string1), z_list[i])
       return z_list[len(string1):]
    
    def solve(str1, str2):
       fwd = search(str2, str1)
       bwrd = search(str2[::-1], str1[::-1])
       bwrd.reverse()
       idx = []
       for i in range(len(str1) - len(str2)+1):
          if fwd[i] + bwrd[i+len(str2)-1] >= len(str2)-1:
             idx.append(str(i))
       if len(idx) == 0:
          return False
       else:
          return (" ".join(idx))
    
    print(solve('tpoint', 'pi'))
    >

    入力

    'tpoint', 'pi'
    

    出力

    1 2

    1. Pythonのグリッドボックスのどこにボールが着地するかを見つけるプログラム

      m x nグリッドボックスが与えられたとします。各セルには、右上から左下、または左上から右下のいずれかに配置されたボードがあります。上のセルからボールがボックスに入れられ、そのボールがボックスの下部に到達するかどうかを確認する必要があります。グリッドはマトリックスとして与えられます。セルに1のマークが付いている場合、対角線上のボードは左上から右下に広がります。 -1とマークされている場合は、右上隅から左下隅にまたがっています。 n個のボールが箱に入れられた場合、底に到達するボールの数を調べる必要があります。 3x3グリッドボックスの例。 したがって、入力がmat =のような場合

    2. 提供された文字列がPythonの同じ位置にある文字によって異なるかどうかを調べるプログラム

      同じ長さの複数の文字列を含む配列が提供されているとします。提供された文字列のいずれか2つが、同じ位置で1文字だけ異なるかどうかを確認する必要があります。この違いが存在する場合はtrueを返し、そうでない場合はfalseを返します。 したがって、入力がdict =[pqrs、prqs、paqs]のような場合、出力はTrueになります。入力にリストされている文字列はすべてインデックス1が異なるため、生成される出力はTrueです。したがって、2つのペアを取得すると、同じ位置に違いが生じます。 これを解決するには、次の手順に従います- 見た:=新しいセット dictの各単語について、実