现在的位置: 首页 > 综合 > 正文

Cracking the coding interview–Q20.7

2014年09月05日 ⁄ 综合 ⁄ 共 1402字 ⁄ 字号 评论关闭

题目

原文:

Write a program to find the longest word made of other words.

译文: 

写一个程序找出由其他单词组成的最长的单词。

解答

首先将单词按照长度的大小降序排序(重写比较器),再不断地取单词的前缀s,当s存在于单词数组中,递归调用该函数, 判断剩余串是否可以由其它单词组成。如果可以,返回true。

代码如下:

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.Comparator;  
import java.util.HashMap;  

class Q20_7{
	public static void main(String[] args){
		String[] arr = createGiantArray();  
        printLongestWord(arr);
	}

	static class LengthComparator implements Comparator<String>{
		public int compare(String o1,String o2){
			return o2.length()-o1.length();
		}
	}

	public static String printLongestWord(String[] arr){
		HashMap<String,Boolean> map=new HashMap<String,Boolean>();
		for(String str:arr){
			map.put(str,true);
		}
		Arrays.sort(arr,new LengthComparator());

		for(String s:arr){
			if(canBuildWord(s,true,map)){
				System.out.println(s);
				return s;
			}
		}
		return "";
	}

	// DFS深搜  
	public static boolean canBuildWord(String str,boolean isOriginalWord,HashMap<String,Boolean> map){
		if(map.containsKey(str)&&!isOriginalWord){  // 一个词只能由其他词组成,自己不能组成自己!  
			return map.get(str);
		}
		for(int i=1;i<str.length();i++){
			String left=str.substring(0,i);
			String right=str.substring(i);
			if(map.containsKey(left)&&map.get(left)==true&&canBuildWord(right,false,map)){
				return true;
			}
		}
		map.put(str,false);  // 记录str不能被其他的单词表示,如果以后再遇到str就可以不继续找了 
		return false;
	}

	public static String[] createGiantArray() {  
        String arr[] = {"test", "tester", "testertest", "testing", 
                "apple", "seattle", "banana",  "batting", "ngcat", 
                "batti","bat", "testingtester", "testbattingcat"};
        return arr;
    }
}

---EOF---

抱歉!评论已关闭.