Algorithm 如何找到使字符串平衡的最小操作数?

Algorithm 如何找到使字符串平衡的最小操作数?,algorithm,dynamic-programming,Algorithm,Dynamic Programming,发件人: 当且仅当字符串中所有字符出现的次数相等时,才认为字符串是平衡的 给您一个字符串S;此字符串只能包含大写英文字母。您可以执行以下操作任意次数(包括零次):在S中选择一个字母,并将其替换为另一个大写英文字母。请注意,即使替换的字母多次出现在S中,也只会替换选定的该字母 查找将给定字符串转换为平衡字符串所需的最小操作数 例如: 输入:ABCB 在这里,我们可以将C替换为A,得到:ABAB,其中字符串的每个字符出现2次 因此,最小操作数=1 如何使绳子好 我可以将动态规划应用到它吗?我认为这里

发件人:

当且仅当字符串中所有字符出现的次数相等时,才认为字符串是平衡的

给您一个字符串
S
;此字符串只能包含大写英文字母。您可以执行以下操作任意次数(包括零次):在
S
中选择一个字母,并将其替换为另一个大写英文字母。请注意,即使替换的字母多次出现在
S
中,也只会替换选定的该字母

查找将给定字符串转换为平衡字符串所需的最小操作数

例如:

输入:
ABCB

在这里,我们可以将
C
替换为
A
,得到:
ABAB
,其中字符串的每个字符出现2次

因此,最小操作数=
1

如何使绳子好


我可以将动态规划应用到它吗?

我认为这里不需要动态规划

O(长度(S))时间内的一种进近:

  • 迭代S,构建频率图(从不同字母a–Z到计数的映射)。对于您的
    ABCB
    示例,这将是
    A->1b->2c->1d->0e->0。。。Z->0
    ,我们可以将其表示为数组
    [1,2,1,0,0,…,0]
    • 我们可以这样做,因为我们根本不在乎字母的位置;
      ABCB
      ABBC
      之间没有真正的区别,因为可以用
      A
      替换其
      C
  • 对数组进行排序。例如,它给出了
    [0,0,…,0,1,1,2]
    • 我们可以这样做,因为我们实际上并不关心哪个字母是哪个字母;
      ABCB
      ABDB
      之间没有真正的区别,它们可以通过将其中一个单子字母替换为另一个来平衡
  • 假设字符串为非空(因为如果为空,则答案仅为0),最终的平衡字符串将包含至少1个,最多26个不同的字母。对于1到26之间的每个整数i,确定需要执行多少操作才能生成具有i个不同字母的平衡字符串:
    • 首先,检查长度(S)是否为i的倍数;如果不是,这是不可能的,所以跳到下一个整数
    • 接下来,计算长度/i,即最终平衡字符串中每个不同字母的计数
    • 为了计算需要执行多少操作,我们将检查所有需要增加的计数。(我们可以同等地检查需要减少的数量:它们必须匹配。)
    • 我们只对排序数组的最后i元素感兴趣。该点之前的任何元素都表示不会出现在平衡字符串中的字母:要么计数已经为零并将保持为零,要么计数为非零但将减少为零。不管怎样,因为我们只跟踪增长,所以我们可以忽略它们
    • 对于每个小于长度/i的最后i个计数,添加差值。此总和是操作数。(请注意,由于计数已排序,因此只要达到大于或等于目标计数的计数,就可以退出此内部循环。)
    • 您可以在第一个i之后退出此循环,该i大于或等于原始s中不同字母的数量(除了i的值,我们必须跳过该值,因为它们不能平均分割长度)。例如,如果长度(s)=100,而原始S有19个不同的字母,那么我们只需要考虑高达20。(这句话的意思是,建议你做些什么。)
  • 返回最多26个总数中的最小值。(请注意,您实际上不需要存储所有的总和;您只需跟踪最小值即可。)

我认为这里并不需要动态编程

O(长度(S))时间内的一种进近:

  • 迭代S,构建频率图(从不同字母a–Z到计数的映射)。对于您的
    ABCB
    示例,这将是
    A->1b->2c->1d->0e->0。。。Z->0
    ,我们可以将其表示为数组
    [1,2,1,0,0,…,0]
    • 我们可以这样做,因为我们根本不在乎字母的位置;
      ABCB
      ABBC
      之间没有真正的区别,因为可以用
      A
      替换其
      C
  • 对数组进行排序。例如,它给出了
    [0,0,…,0,1,1,2]
    • 我们可以这样做,因为我们实际上并不关心哪个字母是哪个字母;
      ABCB
      ABDB
      之间没有真正的区别,它们可以通过将其中一个单子字母替换为另一个来平衡
  • 假设字符串为非空(因为如果为空,则答案仅为0),最终的平衡字符串将包含至少1个,最多26个不同的字母。对于1到26之间的每个整数i,确定需要执行多少操作才能生成具有i个不同字母的平衡字符串:
    • 首先,检查长度(S)是否为i的倍数;如果不是,这是不可能的,所以跳到下一个整数
    • 接下来,计算长度/i,即最终平衡字符串中每个不同字母的计数
    • 为了计算需要执行多少操作,我们将检查所有需要增加的计数。(我们可以同等地检查需要减少的数量:它们必须匹配。)
    • 我们只对排序数组的最后i元素感兴趣。该点之前的任何元素表示不会出现在平衡字符串中的字母:要么计数已经为零并将保持为零,要么计数为非零但不为零
      `x=input()
      char=26
      total=0
      lis=[0]*char
      #print(lis)
      
      for i in range(len(x)):
          lis[ord(x[i])-ord('a')]+=1
      #print(lis) 
      
      for i in range(26):
          if(lis[i]>1):
              total=total+(lis[i]-1)
      print(total)