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个总数中的最小值。(请注意,您实际上不需要存储所有的总和;您只需跟踪最小值即可。)
- 迭代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)