2019届百度秋招笔试题第二题_字符串计数

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

1.题目描述

  给定一个仅由小写字母组成且长度不超过106的字符串,将首字符移到末尾并记录所得的字符串,不断重复该操作,虽然记录了无限个字符串,但其中不同字符串的数目却是有限的,那么一共记录了多少个不同的字符串?
样例输入
   abab
样例输出
   2
样例解释
   记录了abab和baba这2个不同的字符串。

2.解题思路

方法1:对字符串不断进行重组,对不同的字符串进行入队,最后返回队列的大小即为不同的字符串个数

方法2:利用kmp算法的next数组,可以求出字符串的最小循环周期T,这就是答案

3.代码

方法1:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sr = new Scanner(System.in);
        String str = sr.nextLine();
        System.out.println(solution(str));
    }
    public static int solution(String str){
        List<String> list = new ArrayList<>();
        String temp = str;
        list.add(str);
        for(int i = 0;i<str.length();i++){
        	//首字符移到末尾并记录所得的字符串,
            temp = temp.substring(1,str.length())+temp.charAt(0);
            //如果list里面没有该字符串则加入list
            if(!list.contains(temp)){
                list.add(temp);
            }
        }
        return list.size();
    }
 }

方法2:KMP算法

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sr = new Scanner(System.in);
        String str = sr.nextLine();
        System.out.println(kmp(str));
    }
     public static int kmp(String str){
        int len = str.length();
        int [] next = new int[len+1];
        next[0] = -1;
        int k = -1;
        int j  = 0;
        while (j < len ){
            if(k== -1 || str.charAt(k) == str.charAt(j)){
                next[++j] = ++k;
            }else{
                k = next[k];
            }
        } 
        //next[j] = k 代表p[j] 之前的模式串子串中,有长度为k 的相同前缀和后缀,这里next[len]表示len-1之前的模式串,即为str时,有k的相同的前缀和后缀
        //所以循环周期T为 总长度-相同前缀数
        int res = len % (len - next[len]);
        if(res != 0)
            return len;
        else
            return len-next[len];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_17556191/article/details/95058356