给你一行字符串,每个单词用空格分隔。您只能在字符串的第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
将位于同一行
答案 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++;
}
}
如果下一个字符是休息区的空格,则会留下起始空格。不确定是否需要。