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

Pythonで非共有単語の最大長を見つけるプログラム


単語と呼ばれる小文字のアルファベット文字列のリストがあるとすると、共通の文字を共有しない2つの異なる単語の長さの最大合計を見つける必要があります。したがって、入力がwords =["abcd"、 "mno "、" abdcmno "、" amno "]の場合、単語は共通の文字を共有しないため、出力は7になります[" abcd "、" mno "]、全長は7です。

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

  • 関数sign()を定義します。これには言葉が必要です
  • 値:=0
  • 単語のcごとに、
    • value:=value OR(2 ^(ASCII of c-ASCII of'a'))
  • 戻り値
  • メインの方法から、次の手順を実行します
  • signature:=単語内の各xのsign(x)を含むリスト
  • ans:=0
  • 0から単語のサイズまでの範囲のiについては、
    • i + 1から単語のサイズまでの範囲のjについては、
      • signature [i] ANDsignature [j]が0と同じ場合、
        • ans:=ansの最大値と単語のサイズ[i]+単語のサイズ[j]
  • 回答を返す

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

class Solution:
   def sign(self, word):
      value = 0
      for c in word:
         value = value | (1 << (ord(c) - 97))
      return value
   def solve(self, words):
      signature = [self.sign(x) for x in words]
      ans = 0
      for i in range(len(words)):
         for j in range(i + 1, len(words)):
            if signature[i] & signature[j] == 0:
               ans = max(ans, len(words[i]) + len(words[j]))
      return ans
ob = Solution()
words = ["abcd", "mno", "abdcmno", "amno"]
print(ob.solve(words))

入力

["abcd", "mno", "abdcmno", "amno"]

出力

7

  1. Pythonで同じ長さのk個のリボンの最大長を見つけるプログラム

    リボンの長さを表す正の数のリストがあり、1つの値kもあるとします。リボンは何度でもカットできます。長さrのリボンをk個持つことができるように、最大​​の長さrを見つける必要があります。そのような解決策が見つからない場合は、-1を返します。 したがって、入力がribbons =[1、2、5、7、15] k =5の場合、サイズ15のリボンをそれぞれ長さ5の3つの部分にカットできるため、出力は5になります。次に、サイズ7のリボンをサイズ2と5にカットします。また、サイズ5のリボンがもう1つあるので、合計でサイズ5のリボンが5つ得られます。 これを解決するには、次の手順に従います- 左:=0

  2. Pythonで最大の建物の高さを見つけるプログラム

    値nと、制限と呼ばれるペアの別のリストがあるとします。都市にn棟の新しい建物を建てたいと思っています。ただし、制限はほとんどありません。私たちは一列に建てることができ、建物には1からnまでのラベルが付けられています。制限には2つのパラメーターがあるため、restrictions [i] =(id_i、max_height_i)は、id_iの高さがmax_height_i以下でなければならないことを示します。新しい建物の高さに関する市の制限は次のとおりです- 各建物の高さは0または正の値である必要があります。 最初の建物の高さは0でなければなりません。 隣接する2つの建物の高さ