当前位置: 首页 > 知识库问答 >
问题:

找到获得“好”字符串的最小移动次数

戈建白
2023-03-14

当且仅当“字符串中的所有不同字符重复相同次数”时,称字符串为良好字符串。

现在,给定一个长度为n的字符串,我们必须在这个字符串中进行的最小更改次数是多少,这样字符串就变得正常了。

注意:我们只允许使用小写英文字母,我们可以将任何字母更改为任何其他字母。

示例:让String为yyxzzxxx

那么这里的答案是2。

说明:一种可能的解决方案YYXYXX。我们已将2“z”更改为2“y”。现在“x”和“y”都重复了4次。

我的做法:

  1. 对所有26个小写字母的出现处进行散列
  2. 还要查找字符串中不同字母的数量
  3. 对该散列数组进行排序,并开始检查字符串的长度是否可以被不同字符数整除。如果是,那么我们得到了答案
  4. 否则将不同字符减少1

但对于某些结果,它给出了错误的答案,因为当删除一些未出现最短时间的字符时,它们可能会以较少的移动提供一个好的字符串。

那么如何解决这个问题呢。请帮忙。

限制条件:字符串的长度最多为2000。

我的做法:

string s;
    cin>>s;
    int hash[26]={0};

    int total=s.length();
    for(int i=0;i<26;i++){
        hash[s[i]-'a']++;
    }
    sort(hash,hash+total);
    int ans=0;
    for(int i=26;i>=1;i--){
        int moves=0;
        if(total%i==0){
            int eachshouldhave=total/i;
            int position=26;
            for(int j=1;j<26;j++){
                if(hash[j]>eachshouldhave && hash[j-1]<eachshouldhave){
                    position=j;
                    break;
                }
            }
            int extrasymbols=0;
            //THE ONES THAT ARE BELOW OBVIOUSLY NEED TO BE CHANGED TO SOME OTHER SYMBOL
            for(int j=position;j<26;j++){
                extrasymbols+=hash[j]-eachshouldhave;
            }
            //THE ONES ABOVE THIS POSITION NEED TO GET SOME SYMBOLS FROM OTHERS
            for(int j=0;j<position;j++){
                moves+=(eachshouldhave-hash[j]);
            }
            if(moves<ans)
            ans=moves;
        }
        else
        continue;
    }

共有1个答案

郦何平
2023-03-14

以下内容应修复您的实现:

std::size_t compute_change_needed(const std::string& s)
{
    int count[26] = { 0 };

    for(char c : s) {
        // Assuming only valid char : a-z
        count[c - 'a']++;
    }
    std::sort(std::begin(count), std::end(count), std::greater<int>{});
    std::size_t ans = s.length();
    for(std::size_t i = 1; i != 27; ++i) {
        if(s.length() % i != 0) {
            continue;
        }
        const int expected_count = s.length() / i;
        std::size_t moves = 0;
        for(std::size_t j = 0; j != i; j++) {
            moves += std::abs(count[j] - expected_count);
        }
        ans = std::min(ans, moves);
    }
    return ans;
}
 类似资料:
  • 这是在线编码挑战之一(已完成)提出的问题<我只是需要一些逻辑来说明如何接近。 我们有两个字符串A和B,具有相同的超字符集。我们需要改变这些字符串来获得两个相等的字符串。在每个步骤中,我们可以执行以下操作之一: 移动可以在任一字符串上执行。 为了获得两个相等的字符串,我们需要的最小移动次数是多少? 输入格式和约束: 输入的第一行和第二行包含两个字符串A和B。保证它们的超集字符相等。 输出格式: 将最

  • 我们有一个 n 个正整数的数组。可接受的做法是将所有元素增加 1 或 2 或 5,但一个元素除外。我们需要找出最小操作数,以使所有数组元素的数量相等。 经过搜索,我找到了一种方法: 找出非最小元素与最小元素之间的所有差异 通过使用硬币找零方法,找到为所有差异找零所需的最小硬币数量 返回所有这些最小硬币数量的总和 但是这种方法对于此测试用例失败: 数组:< code>1,5,5 最小操作数:3 ()

  • 问题内容: 在Objective-C中,我使用了: 但是现在NSBackWardsSearch似乎不存在。谁能为Swift提供等效的代码? 我希望能够在整个字符串中找到字符数。因此,在上面的示例中,它将返回3。 问题答案: 可可框架应该可以在Swift中访问,但是您需要导入它们。尝试导入以访问NSString API。从“将Swift与Cocoa和Objective-C结合使用”指南的“使用Coc

  • 我试图从字符串中找到最小的子字符串(包含 set 的所有值) 例如: 因为< code>OxVxT是示例1中最小的子串(包含集合的所有元素),所以我为它编写了代码,但这不是最好的方法,也不适用于所有示例,我没有通过我的代码找到最小的子串,我的代码如下: 我找到所有可能的子字符串索引,然后找到它们之间的距离,并且距离最短的子字符串是字符串中最小的子字符串。我的代码不能处理所有测试用例,也没有给出正确

  • 问题内容: 我在尝试搜索字符串中的子字符串时遇到问题。该子字符串可能在字符串中也可能不在字符串中。 我知道是否可以完成的两种方法是: 正则表达式 但是,还有其他“优化”方式吗?你会怎么做? Ruby可以提供更好的答案吗?由于我们使用jRuby,因此答案可以是Ruby或Java。 问题答案: 在Ruby中,使用方法: 返回。

  • 我有一个字符串s和一个整数k(子字符串长度),我正在尝试编写函数,这样它就可以找到长度为k的最小和最大的子字符串。并返回一个字符串,其中最小和最大的子字符串与换行符组合在一起。 到目前为止,我用下面的方法解决了这个问题,我编写了相同的代码来查找最小和最大的子字符串,然而,我想用流返回两个子字符串的单行代码。 我非常感谢任何建议,因为我现在正在学习lambda和stream。 那么,我该如何优雅地解