题目: 删除一个字符串里出现次数最多的子字符串
如果有多个出现次数相同的并且出现次数最多则将多个全部删除比如abbccd得到结果 ad
分析:
第一步,首先将该字符串的所有子字符串都列出来,并且统计出每个子字符串出现的次数(这需要使用HashMap来解决);
第二步,找出子字符串中出现次数最多的子字符串,并将其保存下来(需要使用List集合来解决问题);
第三步,将原始字符串中的子字符串全部使用“”替换掉,最后得到题目结果(使用String的replaceAll()f方法替换字符串)。
代码:
package 华为机试题;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
/**
* @author Hutongling
*
* @time:2017年4月9日 上午11:07:21
*/
public class 删除一个字符串里出现次数最多的子字符串 {
//子字符串集合
static Map<String,Integer> subStringSubset(String string){
if(string==null || string.length()==0)
return null;
Map<String,Integer> map=new LinkedHashMap<>(); //定义一个set集合存储结果
map.put(string.substring(0, 1), 0);;
for(int i=1;i<string.length();i++){ //此处的i为定义子字符串的长度,子字符串的长度从1到n-1
for(int j=0;j<=string.length()-i;j++){
if(map.containsKey(string.substring(j, j+i)))
map.put(string.substring(j, j+i),map.get(string.substring(j, j+i))+1);//从原始字符串中将一定长度的子字符串取出来放进map集合中,并统计每种字符出现的次数
else
map.put(string.substring(j, j+i), 1);
}
}
System.out.println("子字符串集合及每种子字符串出现的次数: "+map);
return map;
}
static void deleteMaxSubString(String string){
Map<String,Integer> map=subStringSubset(string);
Set<String> keySet=map.keySet();
int times=Integer.MIN_VALUE;
LinkedList<String> list=new LinkedList<>();
for(String s:keySet)
if(map.get(s)>times)
times=map.get(s);
for(String s:keySet)
if(map.get(s)==times)
list.add(s);
System.out.println("需要删除的子字符串: "+list);
for(int i=0;i<list.size();i++)
string=string.replaceAll(list.get(i),"");
System.out.println("删除子字符串之后的结果:"+ string);
}
public static void main(String[] args) {
String string="abbccd";
deleteMaxSubString(string);
}
}
代码结果:
子字符串集合及每种子字符串出现的次数: {a=1, b=2, c=2, d=1, ab=1, bb=1, bc=1, cc=1, cd=1, abb=1, bbc=1, bcc=1, ccd=1, abbc=1, bbcc=1, bccd=1, abbcc=1, bbccd=1}
需要删除的子字符串: [b, c]
删除子字符串之后的结果:ad