Python 将字符串的左旋转和右旋转相同的字符的最小更改数

Python 将字符串的左旋转和右旋转相同的字符的最小更改数

旋转意味着我们必须将每个字符向前或向后移动。向前移动意味着右旋转(或逆时针),向后移动意味着左旋转(或顺时针)。

在这个问题中,我们给出了一个大小为n的字符串。我们的任务是找到要更改的最小字符数,以检查是否可能使字符串的左旋转和右旋转相同。

让我们通过下面的示例和解释来更好地理解问题。

输入1

str = "wxyz"

输出 1

2

解释

字符串的左旋是 xyzw

字符串的右旋是 zwxy

根据观察,将字符串中 0 位置上的字符 str[0] 由 w 变为 y,将 3 位置上的字符 str[3] 由 z 变为 x。字符串变为 yxyx。

因此,答案为 2,因为左旋和右旋后的字符串都变为 xyxy。

输入2

str = "aka"

输出2

1

解释

字符串的左旋转是aak

字符串的右旋转是kaa

因此,根据观察,在位置1上将字符k更改为a。字符串变为aaa。

因此,答案是1,因为左旋转和右旋转的字符串都变为aaa。

方法

在看到上面给定字符串的示例后,让我们继续进行方法。

这种方法的思路是基于观察。观察有两点-

  • 当字符串的长度为偶数时,在字符串的偶数索引和奇数索引处的所有字符必须相同,以使得左旋转和右旋转的字符串相同。

  • 当字符串的长度为奇数时,字符串中的所有字符必须相同,以使得左旋转和右旋转的字符串相同。

让我们看下面的代码以更好地理解上述方法。

示例

# Function to find the minimum characters to be removed from the string
def getMinimumChange(str, n):
   # Initialize answer by N in variable minNum
   minChanges = n
   # If the length of the string is even
   if (n % 2 == 0):
      # Created frequency array for Even index
      freqEvenIdx = {}
      # Created frequency array for odd index
      freqOddIdx = {}
      # Traverse for loop to intialize both the frequency array freqEvenddIdx and freqOddIdx to 0
      for ch in range(ord('a'), ord('z') + 1):
         freqEvenIdx[chr(ch)] = 0
         freqOddIdx[chr(ch)] = 0
      # at odd and even index
      for i in range(n):
         if (i % 2 == 0):
            if str[i] in freqEvenIdx:
               freqEvenIdx[str[i]] += 1
         else:
            if str[i] in freqOddIdx:
               freqOddIdx[str[i]] += 1
      # Create variable evenIdxMax and OddIdxMax to store maximum frequency of even place character and odd place character respectively
      evenIdxMax = 0
      oddIdxMax = 0
      # Traverse for loop from a to z to update variable evenIdxMax and OddIdxMax
      for ch in range(ord('a'), ord('z') + 1):
         evenIdxMax = max(evenIdxMax, freqEvenIdx[chr(ch)])
         oddIdxMax = max(oddIdxMax, freqOddIdx[chr(ch)])
      # Update the answerin variable minChanges
      minChanges = minChanges - evenIdxMax - oddIdxMax
   # If the length of the string is odd
   else:
      # Create array to store frequecy of character of the string
      freq = {}
      #  initialize the the freq array
      for ch in range('a', 'z'):
         freq[chr(ch)] = 0
      # Stores the frequency of the characters of the string while traversing the string
      for i in range(n):
         if str[i] in freq:
            freq[str[i]] += 1
      # Stores the maximum freuency of character of the string in variable freqMax
      freqMax = 0
      #  Traverse the for loop to update freqMax
      for ch in range('a', 'z'):
         freqMax = max(freqMax, freq[chr(ch)])
      # Update the answer in variable minChanges
      minChanges = minChanges - freqMax
# Return final answer minChanges
   return minChanges
str = "wxyz"  # Given String
n = len(str)  # Getting size of the given string
# Call the function to get minimum number of changes to make left and right rotated string same
res = getMinimumChange(str, n)
# Print result
print(
   "The minimum number of changes to make the left and right rotated string same are: "
)
print(res)

输出

The minimum number of changes to make the left and right rotated string same are: 
2

时间和空间复杂度

上述代码的时间复杂度是O(N),因为我们同时遍历了字符串和数字。

上述代码的空间复杂度是O(1),因为没有使用额外的空间来存储任何内容。

其中,N是字符串的大小。

结论

在本教程中,我们实现了一个Python3程序,将字符改变的数量最小化,使得字符串的左右旋转相同。我们采用了哈希的方法来存储频率。时间复杂度为O(N),空间复杂度为O(1),其中N是给定字符串的大小。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程