algorithm - 最大化以特定字符结尾的行数

标签 algorithm

给你一行字符串,每个单词由空格分隔。您只能在字符串的第 5-10 列中插入新行。您的目标是最大限度地增加以字符 x 结尾的行数。例如,你会怎么做。

编辑:单词可以以任何字符结尾,假设给定了文本

abcdfg cdx abcdx abcdefg aa ggffx ax

那么显示它们的方式就是

column:
1234567890
abcdfg cdx
abcdx
abcdefg 
aa ggfx
ax

这会最大化结果,因为它有 4 行以 x

结尾

我觉得这道题真正的问题是,如果它不是以x结尾,而且是在一个可以break的位置,我们怎么break。

观察

abcdefg 
aa ggfx
ax

如果 aa 与 abcdefg 在第一行,那么我们将只能再多一行 x,因为 ggfx 不能立即中断。结果 ggfx ax 将在同一行

最佳答案

每当您可以断行并遇到合适的字符时就断行。如果接下来的九个中没有目标字符,则一直打破。

不幸的是,这将给出最佳答案。这是一个简单的游戏。

如果我们可以对在某些列范围内(例如,第 8-10 列)具有目标字符的行进行评分,那将会更有趣。但只计算最后一列,贪心占了上风。

我在这里假设您可以在不必连字符或其他任何东西的情况下切碎单词。但是您没有给我们其他规则,那么我还能做出什么其他假设?

String str = "000x0dfkdfjfxxiwrhx fsjhfx fwuhxjhfe xj etc etc you get it";
int doneidx = 0;
char targetchar = 'x';
StringBuffer tmp = new StringBuffer();
while (doneidx < str.length()) {
    if (tmp.length() < 5) {
        tmp.append(str.charAt(doneidx));
    } else {
        for (int i = 0; i < 6; i++) {
            if (doneidx+i < str.length() && str.charAt(doneidx+i) == targetchar) {
                tmp.append(str.substring(doneidx, doneidx+i+1)); 
                doneidx += i+1;
                break;
            }
        }
        System.out.println(tmp.toString());
        tmp = new StringBuffer();
    }
}

这是一个复杂度为 O(N^2) 的算法。使用记忆化可以将其减少到 O(N)。但是,老实说,我认为这并不重要。

关于algorithm - 最大化以特定字符结尾的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3234064/

相关文章:

c++ - 这种冒泡排序的递归实现是否效率低下?如果可能的话如何改进?

algorithm - 查找一组值的所有唯一子集

algorithm - 比较计数算法的伪代码

regex - 鉴于我已经实现了基本的正则表达式匹配器,我该如何实现词法分析器?

algorithm - 图像失真算法资源

python - 算法问题,python字符串,不知道

algorithm - 分布式系统中的投票算法

algorithm - 在(不完全)拉丁方中寻找周期

algorithm - K-Medoid (PAM) 算法的缺点

algorithm - 为什么单链表中的删除运行时间被认为是常数 O(1)?