题目大意
不论字母大小写的词频统计,要求统计给出单词(以下称为模板)在给出的文本(以下称为文本)中一共出现几次,以及该单词第一次出现的首字母位置,没有则返回-1。
解题思路:
首先,处理输入的文本,将字母都变成小写来遍历查找,并记录单词首字母的位置。我最先想到的是指针法,遍历文本,若是出现文本中有字母和模板的首字母相同,则开始后续的对比,若是相同且是首次出现则记录首字母位置,若是不同则模板指针重置为0,文本指针继续向前。
此处要注意可能出现的特殊情况,比如模板是单个字母,以及某个单词(funny—>fun)只有部分符合等情况,下文会进行详细解说。
具体步骤
1.变量的定义以及文本的基本处理
定义字符串model作为模板,lines作为文本。m为模板指针,l为文本指针,由于文本在遍历时指针会被赋值,而模板只有符合条件时才会开始遍历,所以给一个初始值0,temp作为首字母位置的记录,而sum是出现次数的统计。
此处有个小小ps:Java中next是指读取文本,而nextLine则是会读取包括空串的字符,以换行符作为结尾(并且读取),因此,这两个最好不好一起混用,否则会有跳行的现象,也就是说,要么全部next要么全部nextLine。
代码如下(示例):
public class P1308 {
static String model,lines;
static int m = 0,l,temp = -1,sum = 0;
static boolean first = true;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
model = sc.nextLine();
lines = sc.nextLine();
sc.close();
model = model.toLowerCase();
lines = lines.toLowerCase();
2.字符串的遍历查找
l指针直接开始查找,第一个if条件详解:
l==0:应付第一个单词就是符合模板的情况。
lines.charAt(l-1) == ’ ':确保这是一个新的单词,不会出现上面所说的部分符合条件的情况(adfhs—>fh)。
第二个if条件详解:
应付首字母符合条件但是后面的字母不相符的情况,此处要将m重置。
第三个if条件详解:
m != 0 || model.length() == 1:遍历完成,是符合条件 的单词,并且加上了模板是一个单独单词的情况,此时m=0但是符合条件。
lines.charAt(l+1) == ’ ':应付(abc—>abcde)的情况,确保符合条件的是一个完整的单词。
最后用first布尔变量来判断是否是第一次出现,首字母的位置用减法得到。
代码如下(示例):
for(l = 0;l < lines.length();l++){
if((lines.charAt(l) == model.charAt(m))&&
((l == 0)||(lines.charAt(l-1) == ' '))){
for(int i = 0;i < model.length()-1;i++){
l++;
m++;
if(lines.charAt(l) != model.charAt(m)){
m = 0;
break;
}
}
if((m != 0 || model.length() == 1) && lines.charAt(l+1) == ' '){
sum++;
if(first) {
temp = l - m;
first = false;
}
}
m = 0;
}
}
3.整合最终答案
if(sum == 0) System.out.println(temp);
else {
System.out.print(sum+" "+temp);
}
以上,感觉要考虑的情况很多。