洛谷P1308统计单词数Java题解


题目大意

不论字母大小写的词频统计,要求统计给出单词(以下称为模板)在给出的文本(以下称为文本)中一共出现几次,以及该单词第一次出现的首字母位置,没有则返回-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);
        }

以上,感觉要考虑的情况很多。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值