统计字符串中子串个数 包括重复和不重复 统计个子串中只出现一次的个数总和 和子串中出现不同种类的个数总和
1.题目
统计字符串中子串个数 统计字符串中子串个数 包括重复和不重复 统计个子串中只出现一次的个数总和 和子串中出现不同种类的个数总和
例如 给定一个字符串 s = 'ababc'
则它的子串有
ab
aba
abab
ababc
b
ba
bab
babc
a
ab
abc
b
bc
c
一共15个子串
对于子串 ab 出现个数为 2(a ,b)
对于子串a b a 只出现一次个数为 1 (b)
对于子串abab 只出现一次个数为0(分别为 a b)
……
对于子串 ab 出现不同种类字符个数为 2(a ,b)
对于子串aba 出现不同种类字符个数为2 (a,b)
对于子串abab 出现不同种类字符个数为2(分别为 a b)
……
求输入一个字符串 分别统计子串只出现一个个数总和 和 出现不同种类个数总和
2.代码如下:
//求字符分值 意思就是输入一个字符串 然后对每一个子串统计只出现一次的字符 最终加起来就是总和
//例如 f('ab') = 2 f('aa') = 0
int count = 0 ;//用于统计所有子串只出现一次字符的个数总和
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String s = sc.nextLine();
HashMap<Character,Integer> hs = new HashMap<>();
HashSet<String> h = new HashSet<>();
for(int i = 0 ; i<s.length();i++) {//遍历字符串
for(int j =i+1;j<= s.length();j++) {
System.out.println(s.substring(i,j));//我们可以输出所有的子串
String s1 = s.substring(i,j);//获取每一个子串
h.add(s1);//用hashSet()进行统计不重复的子串
char[] arr = s1.toCharArray();//我们把字符串转换成字符数组
for(char c:arr) {//对字符进行遍历
if(!hs.containsKey(c)) {//判断map里面是否包含该字符的键值 如果没有我们就添加
hs.put(c,1);//
count++;//对应的加一
} else {//如果存在那么我们要减一
count--;
// continue;//统计子串中出现的种类的个数 例如:子串ab 则个数为 2 (a和b) 子串 abac 为3
}
}
for(char c:arr) {
hs.remove(c);//我们遍历完一个字符串我们就全部删除 然后 下一个字符串继续存入进去
}
}
}
System.out.println(count);
System.out.println(h.size());//输出set里面所有的字符串就是不重复的字符串
}
}
3.联系方式
由于我的水平有限 肯定这个做法不是最好的 但是 我才刚刚开始 所以各位大佬不要喷我 (哈哈) 这个适合小白学习 如果对你有帮助 记得赞一个呀 有什么问题也可以联系我
qq:2061302791
微信:xie2061302791
电话:15284524485
个人网站:https://xieyingpeng.github.io
Github:https://github.com/xieyingpeng/
博客园:https://www.cnblogs.com/Xieyingpengz
知乎:https://www.zhihu.com/people/nan-qiao-12-73