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

时间:2010-07-13 03:50:41

标签: algorithm

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

编辑:单词可以以任何字符结尾,比如说你有文字

abcdfg cdx abcdx abcdefg aa ggffx ax

然后显示它们的方式是

column:
1234567890
abcdfg cdx
abcdx
abcdefg 
aa ggfx
ax

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

结尾

我觉得这个问题的真正问题是,如果它不以x结束并且它处于可以破坏的位置,我们如何打破。

观察

abcdefg 
aa ggfx
ax

如果aa在abndefg的第一行,那么我们只能再增加一行x,因为ggfx不能马上打破。因此,ggfx ax将位于同一行

2 个答案:

答案 0 :(得分:1)

每次 打破线并遇到相应的角色时,都会打破这一行。如果在接下来的九个中没有目标角色,则一直打破。

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

如果我们能够对某些列范围内具有目标字符的行进行评分会更有趣(例如,在第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)算法。可以使用memoization将其减少为O(N)。但是,老实说,我觉得这不重要。

答案 1 :(得分:0)

我会天真地尝试类似下面的伪代码:

string foo = "abcdfg cdx abcdx ggx"; 
string newFoo = foo; /* Assumes immutable strings */

int startIndex = 5; 
int endIndex = 10; 
int inserts = 0;

for (int i=startIndex-1; i<=endIndex-1 && i<foo.Length-1; i++) 
{ 
 if (foo.Substring(i, 1) == "x") /* Substr is (startIn, length) */ 
 { 
    newFoo = newFoo.Insert(i+1+inserts, "\n");
    inserts++;
 } 
} 

如果下一个字符是休息区的空格,则会留下起始空格。不确定是否需要。