問題:給定兩個字符串?s
?和?p
,找到?s
?中所有?p
?的?異位詞?的子串,返回這些子串的起始索引。不考慮答案輸出的順序。
package com.text;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;import com.alibaba.fastjson.JSONObject;public class findAnagrams {public static void main(String[] args) {findAnagrams("cbaebabacd","abc");}public static List<Integer> findAnagrams(String s, String p) {List<Integer> list=new ArrayList<Integer>();int slen=s.length();int plen=p.length();//p的長度大于s就返回if(plen>slen){return list;}//將p的字符存儲到map中,key是字符,value是出現的次數Map<Character,Integer> pMap=new HashMap<Character,Integer>();for(int i=0;i<p.length();i++){Integer pNum=pMap.getOrDefault(p.charAt(i), 0);pMap.put(p.charAt(i),pNum+1);}//截取s串的起始坐標int endIndex=0;//存儲截取的S串中字符出現的次數Map<Character,Integer> sMap=new HashMap<Character,Integer>();while(endIndex+plen<=slen){String substr= s.substring(endIndex,endIndex+plen);//下標等于0的時候需要全量存儲if(endIndex==0){for(int i=0;i<substr.length();i++){Integer sNum=sMap.getOrDefault(substr.charAt(i), 0);sMap.put(substr.charAt(i),sNum+1);}}else{//不等于0的時候相當于下標右移//前一個元素出現次數需要減1,如果次數等于0需要移除,否則影響相等的校驗//最后一個需要加1char removeKey = s.charAt(endIndex-1);Integer sNum=sMap.getOrDefault(removeKey, 0);if(sNum-1==0) {sMap.remove(removeKey);}else {sMap.put(removeKey,sNum-1);}char addKey = substr.charAt(plen-1);Integer sNum1=sMap.getOrDefault(addKey, 0);sMap.put(addKey,sNum1+1);}//判斷是否相等兩個map//會進行key和value的全變比較if(sMap.equals(pMap)) {list.add(endIndex);}endIndex++;}System.out.println(JSONObject.toJSONString(list));return list;}}