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]
# include<iostream>
(720)#include<cstring>
# include<map>
(747)# include<algorithm>
# include<vector>
(721)# include<cmath>
#include <sstream>
using namespace std;
struct tri_node{
tri_node * children[26];
bool isWord;
tri_node(){
for(int i=0; i<26; ++i)
children[i] = NULL;
isWord = false;
}
};
void insert( tri_node* rt, string word ){
int i=0;
while(i<word.size()){
if (rt->children[word[i]-'a']==NULL)
rt->children[word[i]-'a'] = new tri_node();
rt = rt->children[word[i]-'a'];
++i;
}
rt->isWord = true;
}
bool search( tri_node * rt, string word ){
int i=0;
while(i<word.size()){
if ( !rt->children[word[i]-'a'] )
return false;
rt = rt->children[word[i]-'a'];
++i;
}
return rt && rt->isWord;
}
vector<string> split( string ip, char c ){
if ( ip.size()==0 || (ip.size()==1 && ip[0]==c) ) return {};
istringstream iss(ip);
vector<string> res;
string tmp;
while( getline(iss, tmp, c) ){
res.push_back(tmp);
}
return res;
}
void dfs(tri_node* rt , string s, int i, vector<string>&res, string cur){
string f = "";
if (i>=s.size() && cur.size()>0){
cur.pop_back();
res.push_back(cur);
return;
}
for(int t=i; t<s.size(); ++t){
f+=s[t];
if (search(rt, f)){
// 找到这个单词了
dfs(rt, s, t+1, res, cur +f+ ' ');
}
}
}
int main(void){
int n,m;
string s, dic;
getline(cin, s);
getline(cin,dic);
s = split(s, '\"')[1];
vector<string> tmp = split(dic,'\"');
vector<string> words;
for(int i=1; i<tmp.size(); i+=2){
words.push_back(tmp[i]);
}
tri_node * rt = new tri_node();
for(auto&word:words)
insert(rt, word);
vector<string> res;
dfs(rt, s, 0, res,"");
reverse(res.begin(), res.end());
cout<<"[";
for(int i=0; i<res.size(); ++i){
cout<<res[i];
if (i+1<res.size())
cout<<", ";
}
cout<<"]"<<endl;
return 0;
} import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine().trim().split("\"")[1];
String[] split = bf.readLine().trim().split("\"");
HashSet<String> dic = new HashSet<>();
for (int i = 0; i < split.length; i++) {
if (i % 2 != 0) {
dic.add(split[i]);
}
}
ArrayList<String> ans = new ArrayList<>();
backtrack(dic, new StringBuilder(), s, ans);
//下面就是字符串的拼接了..........
if (ans.size() == 0){
System.out.println("[]");
return;
}
StringBuilder sb = new StringBuilder();
sb.append('[');
for (int i = 0; i < ans.size() - 1; i++){
String s1 = ans.get(i);
sb.append(s1.substring(0,s1.length()-1)).append(',').append(" ");
}
String s2 = ans.get(ans.size()-1);
sb.append(s2.substring(0,s2.length()-1)).append(']');
System.out.println(sb.toString());
}
//很标准的回溯算法
private static void backtrack(HashSet<String> dic, StringBuilder sb, String s, ArrayList<String> list) {
if (s.isEmpty()) {
list.add(sb.toString());
sb.delete(0, sb.length());//组合成功记得清零
return;
}
for (String item : dic) {
if (s.startsWith(item)) {
backtrack(dic, sb.append(item).append(" "), s.substring(item.length()), list);
}
}
}
}
""""
深度优先搜索DFS
"""
def dfs(s, dic, arr, ans):
if not s:
ans.append(' '.join(arr))
for w in dic:
if s.startswith(w):
dfs(s[len(w):], dic, arr + (w,), ans)
if __name__ == "__main__":
s = input().strip()
s = s[s.index('"') + 1:-1]
dic = input().strip()
dic = eval("[" + dic[dic.index('"'):] + "]")
dic.sort(reverse=True)
ans = []
dfs(s, dic, tuple(), ans)
print('[' + ', '.join(ans) + ']')
分享一下解题思路,感觉递归处的代码有问题,但是还是通过所有测试用例了,欢迎指正
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);
}
}
}
} //亂七八糟,不過通過了所有測試用例
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int sBegin = s.indexOf("\"");
int sEnd = s.lastIndexOf("\"");
s = s.substring(sBegin + 1, sEnd);
String words = in.nextLine();
String[] dict;
int dictBegin = words.indexOf("\"");
int dictEnd = words.lastIndexOf("\"");
words = words.substring(dictBegin + 1, dictEnd);
dict = words.split("\",\"");
StringBuffer sb = new StringBuffer();
System.out.print(f0(f1(s, dict, sb)));
}
public static String f0(String s) {
if (!s.isEmpty()) {
if (s.lastIndexOf(" ") == (s.length() - 1)) {
s = s.substring(0, s.length() - 2);
}
}
return "[" + s + "]";
}
public static String f1(String s, String[] dict, StringBuffer sb) {
for (int i = dict.length - 1; i >= 0; i--) {
if (s.isEmpty()) {
sb.delete(sb.length() - 1, sb.length());
sb.append(", ");
return "";
}
if (s.indexOf(dict[i]) != 0) {
if (i > 0) {
continue;
} else {
// i=0
if (sb.indexOf(", ") == -1) {
sb.delete(0, sb.length());
} else {
int t = sb.lastIndexOf(", ");
sb.delete(t + 2, sb.length());
}
}
} else {
sb.append(dict[i] + " ");
f1(s.substring(dict[i].length()), dict, sb);
}
}
return sb.toString();
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine().replace("s =\"", "").replace("\"", "");
HashSet dict = new HashSet();
String[] arr = sc.nextLine().split("\"");
for(int i=0;i<arr.length;i++) {
if(i%2==1) dict.add(arr[i]);
}
ArrayList al = new ArrayList();
String str = "";
f(str,s,dict,al);
for(int i=0;i<al.size();i++) {
String temp = al.get(i);
al.set(i,temp.substring(0,temp.length()-1));
}//去掉最后的空格
System.out.print(al);
}
public static void f(String str,String s,HashSet dict,ArrayList al) {
for(String x:dict) {
String str_t=str, s_t=s;//防止str,s值被改变
if(s_t.indexOf(x)==0) {
str_t = str_t+x+" ";
s_t = s_t.substring(x.length());
if(s_t.equals("")) al.add(str_t);
else f(str_t,s_t,dict,al);//递归调用
}
}
}
}我不知道为什么只通过了40%,拿着说我不通过的例子在自己的机子上跑,跑出的却是正确的结果。恼火。
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{
static StringBuilder ans = new StringBuilder();
static List<List<Integer>> res = new ArrayList<>();
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String str1 = in.nextLine();
String str2 = in.nextLine();
String s = str1.substring(str1.indexOf('\"')+1,str1.length()-1);
List<String> words = new ArrayList<>();
String[] strs = str2.split("\"");
for(int i = 1; i < strs.length; i+= 2)
words.add(strs[i]);
for(int i = 0; i < words.size(); i++){
insert(words.get(i),root);
}
dfs(0,s,root,new ArrayList<Integer>());
ans.append('[');
for(int i = 0; i < res.size(); i++){
StringBuilder ss = new StringBuilder(s);
for(int j = 0; j < res.get(i).size()-1; j++){
ss.insert(res.get(i).get(j)+j+1,' ');
}
if(i != 0)
ans.append(", ");
ans.append(ss.toString());
}
ans.append(']');
System.out.println(ans.toString());
}
static void dfs(int pos, String s, Node r, List<Integer> path){
if(pos == s.length()){
res.add(0,new ArrayList<>(path));
return;
}
for(int i = pos; i < s.length(); i++){
r = r.next[s.charAt(i)-'a'];
if(r == null)
return;
if(r.isEnd == 1){
path.add(i);
dfs(i+1,s,root,path);
path.remove(path.size()-1);
}
}
}
static Node root = new Node(-1);
static class Node{
int ch;
int isEnd;
Node[] next;
Node(int val){
ch = val;
isEnd = 0;
next = new Node[26];
}
}
static void insert(String str, Node root){
for(int i = 0; i < str.length(); i++){
if(root.next[str.charAt(i)-'a'] == null){
Node p = new Node(str.charAt(i)-'a');
root.next[str.charAt(i)-'a'] = p;
}
root = root.next[str.charAt(i)-'a'];
}
root.isEnd = 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.*;
public class Main{
static ArrayList<String> list = new ArrayList<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s1 = scanner.nextLine().split("=")[1].replaceAll("\"","");
String s2[] = scanner.nextLine().split("=")[1].replaceAll("[\\[\\]\"]","").split(",");
// String str = "dogsandcat";
// String[] dict = new String[]{"dog","dogs","and","sand","cat"};
String str = s1;
String[] dict = s2;
Arrays.sort(dict);
solution(str,dict,new int[str.length()],0,new ArrayList<>());
list.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
System.out.println(list);
}
public static void solution(String str, String[] dict,int[] select,int st,ArrayList<String> result){
if (st>=str.length()){
// System.out.println(result);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < result.size()-1; i++) {
stringBuilder.append(result.get(i)+" ");
}
stringBuilder.append(result.get(result.size()-1));
list.add(stringBuilder.toString());
return;
}
for (int i = st+1; i <= str.length(); i++) {
if (Arrays.binarySearch(dict,str.substring(st,i))>=0){
result.add(str.substring(st,i));
solution(str,dict,select,i,result);
result.clear();
}
}
}
} import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine().split("\"")[1];
String[] temp = sc.nextLine().split("\"");
String[] dict = new String[temp.length / 2];
for (int i = 0; i < temp.length / 2; i ++) {
dict[i] = temp[2 * i + 1];
}
ArrayList> list = new ArrayList();
findSentence(list, s, dict, 0, new ArrayList());
String[] res = new String[list.size()];
for (int i = 0; i < list.size(); i ++) {
ArrayList sentence = list.get(i);
StringBuilder sb = new StringBuilder();
for (int j = 0; j < sentence.size(); j ++) {
sb.append(" " + sentence.get(j));
}
res[i] = sb.toString().substring(1);
}
if (res.length == 2) {
String str = res[0];
res[0] = res[1];
res[1] = str;
}
System.out.println(Arrays.toString(res));
}
private static void findSentence(ArrayList> list, String s, String[] dict, int idx, ArrayList temp) {
if (idx >= s.length()) {
list.add(new ArrayList(temp));
}
for (int i = 0; i < dict.length; i ++) {
String p = dict[i];
int len = p.length();
if (idx + len > s.length()) {
continue;
}
for (int j = 0; j < len; j ++) {
if (p.charAt(j) != s.charAt(idx + j)) {
break;
} else if (j == len - 1) {
temp.add(p);
idx += len;
findSentence(list, s, dict, idx, temp);
idx -= len;
temp.remove(temp.size() - 1);
}
}
}
}
} 用的是跟下面链接中类似的回溯算法,但要注意的是这题还要花大量的时间调试输入输出格式,以及输出句子的顺序要跟标准答案一致
https://leetcode.com/problems/permutations/discuss/18239/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partioning)