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

Pythonで繰り返し文字のないK長の部分文字列を検索する


文字列Sがあるとすると、文字が繰り返されていない長さKの部分文字列の数を見つける必要があります。したがって、S =“ heyfriendshowareyou”でKが5の場合、文字列は[heyfr、eyfri、yfrie、frien、riend、iends、endsh、ndsho、dshow、showa、howar、oware、warey、areyoであるため、出力は15になります。 、reyou]

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

  • 空のマップmを1つ作成し、左:=0、右:=-1、ans:=0
  • 右<文字列の長さ– 1
    • 右–左+ 1 =kの場合、
      • ansを1増やします
      • m[str[left]]を1つ減らします
      • 左に1つ増やします
      • 次の反復に進む
    • str [right + 1]がmにない場合、
      • set m [str [right + 1]]:=1
      • 右に1つ増やします
    • それ以外の場合、m [str [right + 1]]が0の場合、
      • m [str [right+1]]を1増やします
      • 右に1つ増やします
    • その他
      • m[str[left]]を1つ減らします
      • 左:=左+ 1
  • 右–左+ 1 =kの場合、ansを1増やします
  • 回答を返す

理解を深めるために、次の実装を見てみましょう-

class Solution(object):
   def numKLenSubstrNoRepeats(self, S, K):
      m = {}
      left = 0
      right = -1
      ans = 0
      while right<len(S)-1:
         if right - left + 1 == K:
            ans+=1
            m[S[left]]-=1
            left+=1
            continue
         if S[right+1] not in m :
            m[S[right+1]]=1
            right+=1
         elif not m[S[right+1]]:
            m[S[right+1]]+=1
            right+=1
         else:
            m[S[left]]-=1
            left+=1
      if right - left + 1 == K:
         ans+=1
      return ans
ob1 = Solution()
print(ob1.numKLenSubstrNoRepeats("heyfriendshowareyou", 5))
入力
"heyfriendshowareyou"
5

出力

"AIIOC"

  1. Pythonで一般的でない文字と連結された文字列?

    ここでは2つの文字列が与えられています。最初に、最初の文字列からすべての共通要素を削除し、2番目の文字列の一般的でない文字を最初の文字列の一般的でない要素と連結する必要があります。 例 Input >> first string::AABCD Second string:: MNAABP Output >> CDMNP アルゴリズム Uncommonstring(s1,s2) /* s1 and s2 are two string */ Step 1: Convert both string into set st1 and st2. Step 2: use th

  2. Pythonで月曜日の日付だけを見つける方法は?

    Pythonのdatetimeライブラリとtimedeltaオブジェクトを使用すると、次の月曜日の日付を簡単に見つけることができます。今日の日付を取る必要があります。次に、今週すでに経過した日数を減算します(これにより、「最後の」月曜日になります)。最後に、timedeltaオブジェクトを使用してこの日付に1週間を追加すると、次の月曜日の日付が得られます。 例 import datetime today = datetime.date.today() next_monday = today + datetime.timedelta(days=-today.weekday(), weeks=1)