Return all such possible sentences.
s ="catsanddog"
dict ="cat", "cats", "and", "sand", "dog"
[cats and dog, cat sand dog]
s ="catsanddog" dict ="cat","cats","and","sand","dog"
[cats and dog, cat sand dog]
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); String dict = sc.nextLine(); s = s.substring(s.indexOf('\"') + 1, s.lastIndexOf('\"')); dict = dict.substring(dict.indexOf('=') + 1); String[] dictArr = dict.split(","); Set<String> set = new HashSet<>(); for (String e: dictArr){ set.add(e.substring(e.indexOf('\"') + 1, e.lastIndexOf('\"'))); } List<List<String>> ans = new ArrayList<>(); List<String> combine = new ArrayList<>(); traceback(s, 0,0, set, ans, combine); List<String> printAns = new ArrayList<>(); for (List<String> li: ans) { StringBuilder sbd = new StringBuilder(); for (String w: li){ sbd.append(w).append(" "); } sbd.deleteCharAt(sbd.length()-1); printAns.add(sbd.toString()); } System.out.println(printAns); } static void traceback(String s, int start, int pt, Set<String> set, List<List<String>> ans, List<String> combine){ if (pt == s.length()){ if (set.contains(s.substring(start))){ combine.add(s.substring(start)); ans.add(new ArrayList<>(combine)); combine.remove(combine.size()-1); } return; } traceback(s, start,pt+1, set, ans, combine); if (set.contains(s.substring(start, pt+1))){ combine.add(s.substring(start, pt+1)); traceback(s, pt+1, pt+1, set, ans, combine); combine.remove(combine.size()-1); } } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine().split("=")[1].replace("\"", ""); String[] dict = sc.nextLine().split("=")[1].replace("\"", "").split(","); findSentences(s, dict, ""); Collections.reverse(res); System.out.print(res.toString()); } public static List<String> res = new ArrayList<>(); public static void findSentences(String s, String[] dict, String sentence){ //结束条件:s.length == 0 if ("".equals(s) || s.length() == 0){ res.add(sentence.substring(1)); return ; } //将首字母相同的抽取出来 List<String> firstWord = new ArrayList<>(); for (String d : dict) { if (d.charAt(0) == s.charAt(0)){ firstWord.add(d); } } //遍历匹配,匹配成功则删除 for (String word : firstWord) { if (s.contains(word)){ //删除,加入半成品句子,进入下一次递归 findSentences(s.replace(word, ""), dict, sentence + " " + word); } } } }
分享一下解题思路,感觉递归处的代码有问题,但是还是通过所有测试用例了,欢迎指正 import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { private static List<List<String>> ret = new ArrayList<>(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()){ String str = sc.nextLine(); String dict = sc.nextLine(); int sBegin = str.indexOf('\"'); int sEnd = str.lastIndexOf('\"'); str = str.substring(sBegin + 1, sEnd); int dictBegin = dict.indexOf('\"'); int dictEnd = dict.lastIndexOf('\"'); dict = dict.substring(dictBegin + 1, dictEnd); String[] dicts = dict.split("\",\""); List<String> list = new ArrayList<>(); getSentences(str, dicts, list); System.out.println(format(ret)); } } static String format(List<List<String>> ret){ StringBuilder sb = new StringBuilder(); for (int i = ret.size() - 1; i >= 0; --i){ //此处还必须倒着输出 if (i != 0){ for (int j = 0; j < ret.get(i).size(); ++j){ if (j != ret.get(i).size() - 1){ sb.append(ret.get(i).get(j) + " "); }else { sb.append(ret.get(i).get(j) + ", "); } } }else { for (int j = 0; j < ret.get(i).size(); ++j){ if (j != ret.get(i).size() - 1){ sb.append(ret.get(i).get(j) + " "); }else { sb.append(ret.get(i).get(j)); } } } } sb.append(']'); sb.insert(0, '['); return sb.toString(); } static void getSentences(String str, String[] dicts, List<String> list) { if (str.isEmpty()) { ret.add(new ArrayList<>(list)); } for (int i = 0; i < dicts.length; ++i) { if (str.indexOf(dicts[i]) != 0) { if (i == dicts.length - 1) { list.clear(); } } else { list.add(dicts[i]); getSentences(str.substring(dicts[i].length()), dicts, list); } } } }