Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm ra các đường viền palindromic trong một chuỗi trong python

Giả sử chúng ta được cung cấp một chuỗi str. Đường viền của một chuỗi là một chuỗi con là tiền tố thích hợp và là hậu tố của chuỗi đó. Ví dụ:'ab' là một đường viền của chuỗi 'ababab'. Đường viền được gọi là đường viền palindrome nếu chuỗi đường viền là đường viền palindrome. Bây giờ, giả sử có f (str) số đường viền palindrome trong chuỗi str đã cho. Chúng ta phải tìm ra tổng của f (str_k) cho tất cả các chuỗi con không rỗng str_k của str. Tổng có thể lớn, do đó, phép toán mô đun có thể được thực hiện bởi 10 ^ 9 + 7.

Vì vậy, nếu đầu vào là str ='pqpqp', thì đầu ra sẽ là 5 Tồn tại 15 chuỗi con của chuỗi 'pqpqp'; tuy nhiên chỉ có 4 chuỗi con có đường viền palindromic. Các chuỗi là:

pqp : f(pqp) = 1
pqpqp : f(pqpqp) = 2
qpq : f(qpq) = 1
pqp : f(pqp) = 1

The sum of these values are 1 + 2 + 1 + 1 = 5.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một hàm palindrome_calculator (). Điều này sẽ lấy input_dict
    • ans:=0
    • đối với mỗi item1, item2 trong các giá trị của input_dict, thực hiện
      • ans:=ans + item2 * (giá trị sàn của (item2 - 1) / 2)
    • trả lại ans
  • Định nghĩa một hàm str_check (). Điều này sẽ lấy chuỗi
    • t_str:=string [0]
    • đối với mỗi s trong chuỗi, thực hiện
      • nếu s không giống với t_str, thì
        • trả về Sai
      • trả về True
  • Xác định một hàm string_res (). Điều này sẽ lấy chuỗi
    • ans:=0
    • đối với tôi trong phạm vi 2 đến kích thước của chuỗi + 1, thực hiện
      • ans:=ans + i * (giá trị sàn của (i - 1) / 2)
      • ans:=ans mod 1000000007
    • quay lại và
  • nếu str_check (string) là True, thì
    • return string_res (string)
  • ans:=0
  • retail_list:=một danh sách mới chứa một danh sách mới, một bản đồ mới và 1
  • đối với mỗi s trong chuỗi, thực hiện
    • nếu s không có trong danh sách lẻ [1], thì
      • retail_list [1, s]:=0
    • retail_list [1, s]:=retail_list [1, s] + 1
  • đối với tôi trong phạm vi từ 0 đến kích thước của chuỗi, thực hiện
    • chèn tôi vào cuối danh sách lẻ [0]
  • ans:=ans + palindrome_calculator (danh sách lẻ [1])
  • Even_list:=danh sách mới chứa danh sách mới, bản đồ mới và 1
  • đối với tôi trong phạm vi từ 0 đến kích thước của chuỗi - 1, thực hiện
    • nếu chuỗi [i] giống với chuỗi [i + 1], thì
      • chèn tôi vào cuối Even_list [0]
      • tmp:=string [từ chỉ mục i đến i + 2]
      • nếu tmp không có trong Even_list [1], thì
        • Even_list [1, tmp]:=0
      • Even_list [1, tmp]:=Even_list [1, tmp] + 1
  • ans:=ans + palindrome_calculator (Even_list [1])
  • đối với val trong phạm vi 3 đến kích thước của chuỗi, thực hiện
    • nếu val mod 2 giống 0, thì
      • wt:=Even_list
    • nếu không,
      • wt:=retail_list
    • new_t:=một danh sách mới chứa danh sách mới, bản đồ mới và val
    • đối với mỗi chỉ mục trong wt [0], hãy thực hiện
      • nếu index - 1> =0 và index + val - 2
      • chèn chỉ mục - 1 vào cuối new_t [0]
      • tmp:=string [từ chỉ mục chỉ mục - 1 đến chỉ mục - 1 + val]
      • nếu tmp không có trong new_t [1], thì
        • new_t [1, tmp]:=0
      • new_t [1, tmp]:=new_t [1, tmp] + 1
  • ans:=ans + palindrome_calculator (new_t [1])
  • ans:=ans mod 1000000007
  • nếu val mod 2 giống 0, thì
    • Even_list:=new_t
  • nếu không,
    • retail_list:=new_t
  • trả lại ans
  • Ví dụ

    Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn

    def palindrome_calculator(input_dict):
    
       ans = 0
       for item1, item2 in input_dict.items():
          ans += item2 * (item2 - 1) // 2
       return ans
    
    def str_check(string):
       t_str = string[0]
       for s in string:
          if s != t_str:
             return False
       return True
    
    def string_res(string):
       ans = 0
       for i in range(2, len(string) + 1):
          ans += i * (i - 1) // 2
          ans %= 1000000007
       return ans
    
    def solve(string):
       if str_check(string):
          return string_res(string)
       ans = 0
       odd_list = [[], {}, 1]
       for s in string:
          if s not in odd_list[1]:
             odd_list[1][s] = 0
          odd_list[1][s] += 1
       for i in range(len(string)):
          odd_list[0].append(i)
       ans += palindrome_calculator(odd_list[1])
       even_list = [[], {}, 1]
       for i in range(len(string) - 1):
          if string[i] == string[i + 1]:
             even_list[0].append(i)
             tmp = string[i:i + 2]
             if tmp not in even_list[1]:
                even_list[1][tmp] = 0
             even_list[1][tmp] += 1
       ans += palindrome_calculator(even_list[1])
       for val in range(3, len(string)):
          if val % 2 == 0:
             wt = even_list
          else:
             wt = odd_list
          new_t = [[], {}, val]
          for index in wt[0]:
             if index - 1 >= 0 and index + val - 2 < len(string) and string[index - 1] == string[index + val - 2]:
                new_t[0].append(index - 1)
                tmp = string[index - 1 : index - 1 + val]
                if tmp not in new_t[1]:
                   new_t[1][tmp] = 0
                new_t[1][tmp] += 1
          ans += palindrome_calculator(new_t[1])
          ans %= 1000000007
          if val % 2 == 0:
             even_list = new_t
          else:
             odd_list = new_t
       return ans
    
    print(solve('pqpqp'))

    Đầu vào

    'pqpqp'
    

    Đầu ra

    5