LeetCode Word Break II

https://oj.leetcode.com/problems/word-break-ii/


这个题目的大体意思是,有一个字符串和一个字典,通过匹配将字符串根据字典中的单词添加空格,从而成为一个句子。

我觉得如果没有给出使算法错误的测试数据的话,这个题是很难的,我第一次做这个题目的时候超时了,他给出的车是数据是


Last executed input: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", ["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]

这个我觉得这个测试数据是很难想到的,针对这个测试数据,解决这一类的问题首先要确定,数据的字符串是否可以用字典中的单词来添加空格。



public void Recursion(StringBuffer s, int head,int tail,Set<String>dict,ArrayList<String> tempSet,List<String>resultSet){
		
		String tempString = null;
		
		for(int i=head+1;i<tail;i++){
			tempString = s.substring(head,i);
			if(dict.contains(tempString)){
				
				ArrayList<String>tempset1 = new ArrayList<String>(tempSet);
				tempset1.add(tempString);
				
				Recursion(s, i, tail, dict, tempset1, resultSet);
			}
		}
		
		tempString = s.substring(head,tail);
		
		if(dict.contains(tempString)){
			StringBuffer resultBuffer = new StringBuffer();
			for (String string : tempSet) {
				resultBuffer.append(string+" ");
			}
			resultBuffer.append(tempString);
			resultSet.add(resultBuffer.toString());
		}
		
	}
	
	
	public boolean Canequal(String s, Set<String>dict){
		
		boolean[] a = new boolean[26];
		boolean[] b = new boolean[26];
		
		for(int i=0;i<26;i++){
			a[i]=false;
			b[i]=false;
		}
		
		for(int i=0;i<26;i++){
			if(s.indexOf((char)(i+'a'))!=-1){
				a[i]=true;
			}
		}
		
		for(int i=0;i<26;i++){
			
			for (String string : dict) {
				if(string.indexOf(i+'a')!=-1){
					b[i]=true;
					break;
				}
			}
		}
		
		for(int i=0;i<26;i++){
			if(a[i]==true&&b[i]==false){
				return false;
			}
		}
		
		return true;
	}
	
	
	public List<String> wordBreak(String s, Set<String> dict) {
		
		if(!Canequal(s, dict)){
			return new ArrayList<String>();
		}
		StringBuffer sBuffer = new StringBuffer(s);
		ArrayList<String>tempSet = new ArrayList<>();
		ArrayList<String>resultSet = new ArrayList<String>();
		Recursion(sBuffer, 0, s.length() ,dict,tempSet,resultSet);
		return resultSet;
        
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值