给定m个不重复的字符 [a,b,c,d],以及一个长度为n的字符串tbcacbdata滑动窗口
题目
给定m个不重复的字符 [a, b, c, d],以及一个长度为n的字符串tbcacbdata, 问能否在这个字符串中找到一个长度为m的连续子串,使得这个子串刚好由上面m个字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1。比如上面这个例子,返回3。
本题的子串需要满足长度为m,字符不重复,可以使用长为m的滑动窗口遍历字符串,窗口内每个字符都要出现一次,如果符合条件,就返回窗口起始位置。
滑动窗口算法
滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。
假设有数组 [a b c d e f g h ],一个大小为 3 的滑动窗口在其上滑动,则有:
[a b c] [b c d] [c d e] [d e f] [e f g] [f g h]
一般情况下就是使用这个窗口在数组的合法区间内进行滑动,同时动态地记录一些有用的数据,很多情况下,能够极大地提高算法地效率。
代码
/** * 给定m个不重复的字符 [a, b, c, d],以及一个长度为n的字符串tbcacbdata, * 能否在这个字符串中找到一个长度为m的连续子串,使得这个子串刚好由上面m个字符组成. * 顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1。比如上面这个例子,acbd,3. * * @param ch * @param s * @return */ private int findIndex(char[] ch, String s) { int targetCharSize = ch.length; int totalCharSize = s.length(); if (targetCharSize > totalCharSize) { return -1; } for (int i = 0; i < totalCharSize - targetCharSize; i++) { // 滑动窗口的思想,每次取目标数组大小进行比较,不符后再向后移动 if (checkSubStr(ch, s.substring(i, i + targetCharSize))) { return i; } } return -1; } private boolean checkSubStr(char[] ch, String s) { for (int i = 0; i < ch.length; i++) { if (s.indexOf(ch[i]) == -1) { return false; } } return true; }
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
作者:翎野君
出处:http://www.cnblogs.com/lingyejun/
若本文如对您有帮助,不妨点击一下右下角的【推荐】。
如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。
转载文章请务必保留出处和署名,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/lingyejun/
若本文如对您有帮助,不妨点击一下右下角的【推荐】。
如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。
转载文章请务必保留出处和署名,否则保留追究法律责任的权利。