在一个字符串中查找另外一个字符串的全排列出现位置
2016-03-28 13:07
323 查看
1、在一个字符串中查找另外一个字符串任意的全排列出现位置。例如:A=”abcfsfcba”,B=”abc”,则返回{0,6}。
2、在一个字符串中查找包含另外一个字符串任意全排列的长度最小的字符串。例如:A=”abdcgfgfabbbc”,B=“abc”,A中包含B的子字符串有“abdc”和“abbbc”,最短的则返回“abdc”。
//the des's character must be adjacent public static List<Integer> getIndex(String res,String des){ List<Integer> list=new ArrayList<>(); HashMap<Character,Integer> map=new HashMap<Character, Integer>(); int desLen=des.length(); int resLen=res.length(); for(int i=0;i<desLen;i++){ map.put(des.charAt(i), map.getOrDefault(des.charAt(i), 0)+1); } HashMap<Character,Integer> cur=new HashMap<Character, Integer>(); for(int i=0;i<=resLen-desLen;i++){ if(map.containsKey(res.charAt(i))){ cur.clear(); for(int j=0;j<desLen;j++){ if(map.containsKey(res.charAt(i+j))) cur.put(res.charAt(i+j), cur.getOrDefault(res.charAt(i+j), 0)+1); else break; if(cur.get(res.charAt(i+j))>map.get(res.charAt(i+j)))break; } if(map.equals(cur))list.add(i); } } return list; }
2、在一个字符串中查找包含另外一个字符串任意全排列的长度最小的字符串。例如:A=”abdcgfgfabbbc”,B=“abc”,A中包含B的子字符串有“abdc”和“abbbc”,最短的则返回“abdc”。
// get the min length string in res which contains des public static String getSting(String res, String des) { HashMap<Character, Integer> map = new HashMap<Character, Integer>(); int desLen = des.length(); int resLen = res.length(); for (int i = 0; i < desLen; i++) { map.put(des.charAt(i), map.getOrDefault(des.charAt(i), 0) + 1); } HashMap<Character, Integer> cur = new HashMap<Character, Integer>(); int start = -1, count = 0; String val = res; for (int i = 0; i < resLen; i++) { if (map.containsKey(res.charAt(i))) { if (start == -1)start = i; cur.put(res.charAt(i), cur.getOrDefault(res.charAt(i), 0) + 1); if (cur.get(res.charAt(i)) <= map.get(res.charAt(i)))count++; if (count == desLen) { //move from start pos,pass the multiple character while (!map.containsKey(res.charAt(start))|| cur.get(res.charAt(start)) > map.get(res.charAt(start))) { if (cur.getOrDefault(res.charAt(start), 0) > map.getOrDefault(res.charAt(start), 0)) { cur.put(res.charAt(start),cur.get(res.charAt(start)) - 1); } start++; } // compare to get the min string val = val.length() > (i - start + 1) ? res.substring(start,i + 1) : val; } } } // no match string if (start > 0 && res.equals(val))return ""; return val; }
相关文章推荐
- cmd findstr 字符串查找增强使用说明
- 字符串匹配/模糊匹配(查找/模糊查找)的算法
- KMP - 字符串查找算法
- 计算某字符串在另外一个字符串中出现的次数
- Foundation框架中字符串的查找(rangOfString)
- string类字符串中的两个查找字符函数
- 字符串查找算法-KMP
- 查找字符串之 BF算法
- 为什么JDK中String类的indexof不使用KMP或者Boyer-Moore等时间复杂度低的算法编辑器
- linux平台学x86汇编(十三 ):字符串的比较与搜索
- 找到字符串中第一个不重复的字符
- Java字符串String中contains与indexOf的区别
- 算法习题33:字符串匹配(和谐文字)
- Foundation框架之NSString的小众笔记
- kmp算法的理解与实现
- 字符串匹配的KMP算法
- lua实现查找一个字符串中的某些字符
- 判断字符串中是否包含中文
- AC自动机算法简单介绍
- 分分钟使用正则表达式