洛谷P1308 只有30分求解


public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String findVal = scanner.nextLine().toLowerCase();
        String word = scanner.nextLine().toLowerCase();
        String[] str = word.split(" ");
        int count = 0,firstIndex = -1;
        for(int i = 0;i < str.length;i++){
            if(str[i].equals(findVal)){
                if(count == 0){
                    firstIndex = i;
                }
                count++;
            }
        }

        if(count == 0){
            System.out.println(-1);
        }else {
            System.out.println(count + " " + firstIndex);
        }
        scanner.close();




    }

应该是因为,判断文章字符串第一次出现给定单词的判断那里需要改进下,通过参考洛谷题解,发现判断此单词第一次出现的位置,还需要满足另一个条件,即是在文章字符串第一次出现的前面需要是空格或是文章字符串开头,以及此位置一个给定单词长度后是空格或是达到文章字符串结尾才可以。

修改如下:

参考链接:


https://www.luogu.com.cn/problem/P1308

https://blog.csdn.net/u010227042/article/details/119032461

https://www.luogu.com.cn/problem/solution/P1308?page=4

https://blog.csdn.net/m0_53370922/article/details/127464290


import java.util.Scanner;
// https://blog.csdn.net/qq_45771848/article/details/116517753
public class Main洛谷P1308_寻找字符串中单词出现的次数_2023_4_26 {

     // https://www.luogu.com.cn/problem/P1308
    
    public static void main(String[] args) {
        
            Scanner scanner = new Scanner(System.in);
            String findVal = scanner.nextLine().toLowerCase();
            String word = scanner.nextLine().toLowerCase();
            String[] str = word.split(" ");
            
            int count = 0,firstIndex = -1;
            for(int i = 0;i < str.length;i++){
                //System.out.print(str[i]+" ");
                if(str[i].equals(findVal)){
//                    if(count == 0){
//                        firstIndex = i;
//                    }
                    count++;
                }
            }
            //System.out.println();
            
     // https://blog.csdn.net/u010227042/article/details/119032461
       // luogu.com.cn/problem/solution/P1308?page=4 
            
            int index=0;  // 从文章字符串下标为0的字符开始判断
            int flen = findVal.length();// 给定单词的长度
            int wlen = word.length();  // 文章的长度
            
            // https://blog.csdn.net/m0_53370922/article/details/127464290
            
                 while(index<word.length()) {
                     
                     // 在文章字符串 下标为index的位置开始寻给定单词
                     firstIndex = word.indexOf(findVal,index); 
                     
                     if(firstIndex!=-1) {  // 如果找到给定单词
                         
                         
                         
                         // 并且在此位置的前一个字符为空格,或或者是文章字符串成开头,
                         //并且 此位置一个给定单词长度后是一个空格,或者达到了文章字符串结尾,
                         //则判定此位置为第一次出现给定单词的位置,break退出循环
                         if((firstIndex==0||word.charAt(firstIndex-1)==' ')
                         &&((firstIndex+flen==wlen)||word.charAt(firstIndex+flen)==' ')) {
                             
                             break;
                         }
                         // 如果不满足,上述条件,则继续寻找,位置为当前寻找的位置+给定单词的长度
                         index = firstIndex+flen;
                         continue;
                         
                     }else {   // 如果没找到,则退出循环
                         break;
                     }
                     
                     
                     
                     
                 }
           
            
            
           
            
            if(count == 0){
                System.out.print(-1);
            }else {
                System.out.print(count + " " + firstIndex);
            }
            scanner.close();
     
     
     
     
        }
}

img

这个Java程序接受用户的两个输入:一个要搜索的单词和一个句子。然后它将两者都转换为小写,并将句子拆分为一组单词。然后,它在数组中搜索给定的单词,并计算它出现的次数。如果单词至少出现一次,它将返回第一次出现的计数和索引。如果找不到单词,则返回-1。

该程序从用户那里获取两个输入:一个要查找的字符串和一个要搜索的句子。然后使用string类的toLowerCase()方法将这两个输入转换为小写。

使用String类的split()方法将句子拆分为一个单词数组。用于拆分的分隔符是一个空格字符(“”)。

然后,程序循环遍历数组中的每个单词,并使用string类的equals()方法检查它是否等于搜索字符串。如果找到匹配项,程序会增加一个计数器变量,并记录搜索字符串第一次出现的索引。

如果没有找到匹配项,程序将打印-1。否则,它将打印出现次数和第一次出现的索引。

最后,程序关闭Scanner对象以释放系统资源。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7482109
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:洛谷 P1310 表达式的值
  • 除此之外, 这篇博客: 洛谷P1309 瑞士轮【归并排序】中的 程序说明: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 卡了一个晚上,思路比较简单但是细节很多,有很多大坑!
    每轮比赛结束后都需要对选手的成绩进行排序,这道题不能用STL的sort()或者手写快排进行排序,否则会超时(除非开o2优化)。看了题解之后才知道要用归并排序,于是手写归并结果还是超时。其实是没有掌握到归并的精髓。

    这道题并不需要把归并排序的完整过程写出来(比如递归什么的…),否则和快排就一样了仍然会超时。需要额外开两个数组,每次比赛后,赢的人到x数组,输的人到y数组,这样的话仍然能保证x数组和y数组分别有序,因此只需要进行归并操作就可以了(即双指针)。