LeetCode题目:串联所有单词的子串

题目描述:

给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。输出的顺序不重要, [9,0] 也是有效答案。

示例 2:
输入:
s = “wordgoodgoodgoodbestword”,
words = [“word”,“good”,“best”,“word”]
输出:[]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

因为words里面的元素的长度是固定的,所有字符串拼接起来的长度也是固定的,所以我们从字符串s中按照words里面的元素拼接起来的长度来取子字符串term,然后将words里面的元素添加到list里面,利用列表的remove函数来处理这个问题:按照words里面元素的长度(例如在第一个例子里面,就3个字符3个字符地去)来依次取出子字符串term里面的子串,然后通过list的remove函数处理,如果remove成功,则说明子字符串term里面的这个子串是符合在words里面的,如果term的全部子串都能被remove成功,则说明term是由words里面的元素拼接起来的,把term起始的坐标记录下来。

代码(Java):

public class doingmyself {
	public static void main(String[] args) {
		String s = "wordgoodgoodgoodbestword";
		String[] words = new String[] {"word","good","best","word"};
		
		System.out.println(findSubstring(s, words));
	}
	
	public static List<Integer> findSubstring(String s, String[] words) {
		List<Integer> ans = new ArrayList<Integer>(); //创建一个列表用来存放字符串的坐标
		List<String> list = new ArrayList<String>();  //这个列表由于用于存放words里面的元素,用list的remove函数解题
		if(s.length()==0  || words.length==0) return ans;  //如果输入字符串是空的,或者字符串数组是空的,都返回空的答案列表
		int lenofelement = words[0].length();   //这个是字符数组里面每个元素的长度
		int length = words.length*lenofelement;  //每次取出s的子字符串的长度
		for(int i=0;i<=s.length()-length;i++) {		
			for(int k=0;k<words.length;k++) { //这里不能预先把words里面的内容存放到list里面,然后再复制list,因为复制出来的和list都指向同一个容器,修改之后就被覆盖了
				list.add(words[k]);
			}
			String term = s.substring(i, i+length);  //取出固定长度的子字符串
			boolean flag = true;  //标志位预设为true,如果最后仍然为true,则符合要求,存在当前坐标
			for(int j=0;j<=term.length()-lenofelement;j=j+lenofelement) {
				if(list.remove(term.substring(j, j+lenofelement))==false) {  //从子字符串中按words里面元素的长度一个个拿出子串,如果list里面能够删除成功,则说明原来有这个,全部都能删除成功,则符合要求
					flag = false;  //只要有一次删除不成功的,就不符合要求,直接跳出循环
					break;
				}
			}
			if(flag == true) {
				ans.add(i);
			}
			list.clear();  //最后要清空列表,下次循环开始是重新添加words的元素
		}
		return ans;
    }
}

你可能感兴趣的:(习题)