因此,我试图编写一个程序,一次且仅当它不是前一行的后缀时才读取输入行并输出当前行。等等,如果某行是“ racecar”,而某些后续行是“ car”,则不应输出该后续行。
现在,该程序似乎只打印我所有测试用例的第一行或第二行,而不管当前行是否包含后缀。我需要使用树集来提高程序的效率。我的方法是存储先前字符串的反向,并搜索输入字符串的反向,并检查类似的后缀。任何帮助将不胜感激!
public static String reverse(String a) {
int j = a.length();
char[] newWord = new char[j];
for (int i = 0; i < a.length(); i++) {
newWord[--j] = a.charAt(i);
}
return new String(newWord);
}
public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
TreeSet<String> set = new TreeSet<>();
String line;
while((line = r.readLine()) != null) {
for(String text: set){
reverse(text);
}
if (set.endsWith(reverse(line))) {
w.println(line);
}
}
}
程序应如何工作:
输入:
racecar
car
mad
ad
输出:
racecar
mad
现在它打印racecar, cad, ad
,有点奇怪。
给定的代码调用reverse(text)
在循环中存在一些问题,没有实际效果,因为反转的字符串被简单地丢弃了。另外,字符串永远不会add
-设置为集合(始终为空)。
然后提出建议,请尝试使用程序逻辑拆分控制台输入部分,以便可以自动方式尝试代码。
[下面有一个打印racecar
和mad
的示例实现。它显然没有优化-接受单词时,解决方案将遍历到目前为止接受的所有单词。
package suffixes;
import java.util.*;
import java.util.function.Consumer;
public class SampleDiscard {
public static void main(String[] args) {
// print accepted words
Consumer<String> target = word -> System.out.println(word);
DiscardSuffixes ds = new DiscardSuffixes(target);
List<String> words = Arrays.asList("racecar", "car", "mad", "ad");
for (String word : words) {
ds.onWord(word);
}
}
}
class DiscardSuffixes {
// stores the lines accepted/printed so far
private Collection<String> lines = new ArrayList<>();
// accepted strings are forwarded to "target"
private Consumer<String> target;
DiscardSuffixes(Consumer<String> target) {
this.target = target;
}
/*
* accepts the given string iff it is not a suffix of a previously accepted word.
* after the string is accepted, it is forwarded to "target"
*/
public void onWord(String word) {
// return, if "word" is suffix of any previously accepted word
for (String item : lines) {
if (item.endsWith(word)) {
return;
}
}
// at this point, word is a new suffix
lines.add(word);
target.accept(word);
}
}