java-使用树集检查后缀线并反转它们

问题描述 投票:0回答:1

因此,我试图编写一个程序,一次且仅当它不是前一行的后缀时才读取输入行并输出当前行。等等,如果某行是“ 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,有点奇怪。

java buffer reverse treeset suffix
1个回答
0
投票

给定的代码调用reverse(text)在循环中存在一些问题,没有实际效果,因为反转的字符串被简单地丢弃了。另外,字符串永远不会add-设置为集合(始终为空)。

然后提出建议,请尝试使用程序逻辑拆分控制台输入部分,以便可以自动方式尝试代码。

[下面有一个打印racecarmad的示例实现。它显然没有优化-接受单词时,解决方案将遍历到目前为止接受的所有单词。

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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.