这是一个场景,给定一个单词从每个步骤中的单词中删除单个字符,使得缩小的单词仍然是字典中的单词。继续,直到没有人物离开。
这是一个问题: 你需要删除正确的字符,例如。总之,可能有两个可能被移除的字符,两者都可能导致缩小的单词成为有效单词,但在稍后阶段,可能会缩小到最后,即没有剩下的字符,而另一个可能挂断。
示例:
OR
请参阅我的代码,我使用递归,但想知道是否有更有效的解决方案来做同样的事情。
public class isMashable
{
static void initiate(String s)
{
mash("", s);
}
static void mash(String prefix, String s)
{
int N = s.length();
String subs = "";
if (!((s.trim()).equals("")))
System.out.println(s);
for (int i = 0 ; i < N ; i++)
{
subs = s.substring(0, i) + s.substring(i+1, N);
if (subs.equals("abc")||subs.equals("bc")||subs.equals("c")||subs.equals("a")) // check in dictionary here
mash("" + s.charAt(i), subs);
}
}
public static void main(String[] args)
{
String s = "abc";
initiate(s);
}
}
答案 0 :(得分:2)
运行BFS算法。 如果您可以删除多个字符,请单独删除它们并放入优先级队列,如果要回溯路径,请将指针保留为父项(通过删除字符创建此单词的原始单词) )节点中的单词thelef。当你删除所有字符,终止和回溯路径,或者如果没有有效的方法,你将有一个空的优先级队列
答案 1 :(得分:1)
我在几个项目中使用了Porter Stemming - 这当然只能帮助你减少这个词的结尾。
Porter词干算法(或'Porter stemmer')是一个过程 从单词中删除普通的形态和拐点结尾 用英语讲。其主要用途是作为术语标准化过程的一部分 这通常在设置信息检索系统时完成。
在M.F. Porter, 1980, An algorithm for suffix stripping, Program, 14(3) pp 130−137中发生了重印。
Martin甚至在他的网站上有一个Java version available。
答案 2 :(得分:1)
你走了。 mash-method将使用传递给构造函数的字典为任何给定的String找到解决方案(字典单词列表)。如果没有解决方案(以单字母结尾),该方法将返回null。如果您对所有部分解决方案感兴趣(在获得单个字母之前结束),您应该稍微调整算法。
假定字典是一组大写字符串。你当然可以使用你自己的类/接口。
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class WordMash {
private final Set<String> dictionary;
public WordMash(Set<String> dictionary) {
if (dictionary == null) throw new IllegalArgumentException("dictionary == null");
this.dictionary = dictionary;
}
public List<String> mash(String word) {
return recursiveMash(new ArrayList<String>(), word.toUpperCase());
}
private List<String> recursiveMash(ArrayList<String> wordStack, String proposedWord) {
if (!dictionary.contains(proposedWord)) {
return null;
}
wordStack.add(proposedWord);
if (proposedWord.length() == 1) {
return wordStack;
}
for (int i = 0; i < proposedWord.length(); i++) {
String nextProposedWord =
proposedWord.substring(0, i) + proposedWord.substring(i + 1, proposedWord.length());
List<String> finalStack = recursiveMash(wordStack, nextProposedWord);
if (finalStack != null) return finalStack;
}
return null;
}
}
示例:
Set<String> dictionary = new HashSet<String>(Arrays.asList(
"A", "AFRICA", "AN", "LANE", "PAN", "PANT", "PLANET", "PLANT"
));
WordMash mash = new WordMash(dictionary);
System.out.println(mash.mash("planet"));
System.out.println(mash.mash("pant"));
System.out.println(mash.mash("foo"));
System.out.println(mash.mash("lane"));
System.out.println(mash.mash("africa"));
答案 3 :(得分:0)
好吧,它不是Java,只是JavaScript,但可能你可以改变它:
function subWord( w, p, wrapL, wrapR ){
return w.substr(0,p)
+ ( wrapL ? (wrapL + w.substr(p,1) + wrapR ):'')
+ w.substr(p+1);
}
// wa = word array: ['apple','banana']
// wo = word object/lookup: {'apple':true,'banana':true}
function initLookup(){
window.wo = {};
for(var i=0; i < wa.length; i++) wo[ wa[i] ] = true;
}
function initialRandomWords(){
// choose some random initial words
var level0 = [];
for(var i=0; i < 100; i++){
var w = wa[ Math.floor(Math.random()*wa.length) ];
level0.push({ word: w, parentIndex:null, pos:null, leaf:true });
}
return level0;
}
function generateLevels( levels ){
while(true){
var nl = genNextLevel( levels[ levels.length-1 ]);
if( ! nl ) break;
levels.push( nl );
}
}
function genNextLevel( P ){ // P: prev/parent level
var N = []; // N: next level
var len = 0;
for( var pi = 0; pi < P.length; pi ++ ){
pw = P[ pi ].word; // pw: parent word
for( var cp = 0; cp < pw.length; cp++ ){ // cp: char pos
var cw = subWord( pw, cp ); // cw: child word
if( wo[cw] ){
len++;
P[ pi ].leaf = false;
N.push({ word: cw, parentIndex:pi, pos:cp, leaf:true });
}
}
}
return len ? N : null;
}
function getWordTraces( levels ){
var rows = [];
for( var li = levels.length-1; li >= 0; li-- ){
var level = levels[ li ];
for( var i = 0; i < level.length; i++ ){
if( ! level[ i ].leaf ) continue;
var trace = traceWord( li, i );
if( trace.length < 2 ) continue;
rows.push( trace );
}
}
return rows;
}
function traceWord( li, i ){
var r = [];
while(true){
var o = levels[ li ][ i ];
r.unshift( o );
i = o.parentIndex;
if( !i ) break;
li--;
if( li < 0 ) break;
};
return r;
}
function compareTraces( aa, bb ){
var a = aa[0].word, b = bb[0].word;
if( a == b ){
if( aa.length < bb.length ) return -1;
if( aa.length > bb.length ) return +1;
}
var len = Math.min( aa.length, bb.length )
for( var i = 0; i < len; i++ ){
var a = aa[i].word, b = bb[i].word;
if( a < b ) return +1;
if( a > b ) return -1;
}
if( aa.length < bb.length ) return -1;
if( aa.length > bb.length ) return +1;
return 0;
}
function prettyPrintTraces( rows ){
var prevFirstWord = null;
for( var ri = rows.length-1; ri >= 0; ri-- ){
var row = rows[ ri ];
if( prevFirstWord != row[0].word ){
if( prevFirstWord ) $('body').append('<div class="sep"/>');
prevFirstWord = row[0].word;
}
var $row = $('<div class="row"/>');
for( var i = 0; i < row.length; i++ ){
var w = row[i].word;
var c = row[i+1];
if( c ) w = subWord( w, c.pos, '<span class="cut">', '</span>');
var $word = $('<div class="word"></div>').html( w ).toggleClass('last-word', w.length < 2 );
$row.append( $word );
}
$('body').append( $row );
}
};
function main(){
initLookup();
window.levels = [ initialRandomWords() ];
generateLevels( levels );
rows = getWordTraces( levels );
rows.sort( compareTraces );
prettyPrintTraces( rows );
}
答案 4 :(得分:0)
答案 5 :(得分:0)
这是一种使用深度优先搜索的算法。给出一个单词,检查它是否有效(在字典中)。如果有效,则从每个索引处的字符串中删除一个字符,然后递归检查“切碎”字符。这个词再次有效。如果切断的单词在任何时候都无效,那么您走错路径并返回上一步。
import java.util.HashSet;
import java.util.Set;
public class RemoveOneCharacter {
static Set<String> dict = new HashSet<String>();
public static boolean remove(String word){
if(word.length() == 1)
return true;
if(!dict.contains(word))
return false;
for(int i=0;i<word.length();i++){
String choppedWord = removeCharAt(word,i);
boolean result = remove(choppedWord);
if(result)
return true;
}
return false;
}
public static String removeCharAt(String str, Integer n) {
String f = str.substring(0, n);
String b = str.substring(n+1, str.length());
return f + b;
}
public static void main(String args[]){
dict.add("heat");
dict.add("eat");
dict.add("at");
dict.add("a");
dict.add("planets");
dict.add("planet");
dict.add("plant");
dict.add("plane");
dict.add("lane");
dict.add("plants");
dict.add("pant");
dict.add("pants");
dict.add("ant");
dict.add("ants");
dict.add("an");
dict.add("clean");
dict.add("lean");
dict.add("clan");
dict.add("can");
dict.add("why");
String input = "heat";
System.out.println("result(heat) " + remove(input));
input = "planet";
System.out.println("result(planet) " + remove(input));
input = "planets";
System.out.println("result(planets) " + remove(input));
input = "clean";
System.out.println("result(clean) " + remove(input));
input = "why";
System.out.println("result(why) " + remove(input));
input = "name";
System.out.println("result(name) " + remove(input));
}
}