JavaSE字符串课堂练习题

第一题

/*
问题1:求S2在S1中出现的次数
s1=“abcabcbcacbabbabcba”
s2=“abc”
推荐算法:KMP算法
*/

public static void question1(){
    /*
    问题1:求S2在S1中出现的次数
       s1="abcabcbcacbabbabcba"
       s2="abc"
    */
    String s1="abcabcbcacbabbabcba";
    String s2="abc";
    int count=0;

    for(int i=0;i<s1.length()-s2.length()+1;i++){
        String sub=s1.substring(i,i+s2.length());
        if(sub.equals(s2)){
            count++;
        }
    }
    System.out.println("s2在s1中出现了"+count+"次");
}

从s1的开始开始循环,依次右移,判断等于s2就给计数器加一,最后输出。

第二题

/*
问题2:判断字符串s是否是回文
s=“上海自来水来自海上”
*/

 public static void question2(){
    /*
       问题2:判断字符串s是否是回文
       s="上海自来水来自海上"
    */
        String s="上海自来水来自海上";
        int left=0;
        int right=s.length()-1;
        boolean flag=true;
        while(true){
            if(s.charAt(left)==s.charAt(right)){
                left++;
                right--;
                if(left>=right){
                    break;
                }
            }else{
                flag=false;
                break;
            }
        }
        System.out.println("s是回文吗:"+flag);
    }

定义两个指针,一个从头开始,一个从尾开始,同步向中间移动,如果哪一次不相等就直接跳出循环,最后输出不是回文,如果循环正常结束就是两个指针相遇或者走过了就跳出循环。最后看是不是正常跳出循环的。

第三题

/*
问题3:模拟trim的功能,自定义实现
s=" 安利给~ "
*/

 public static void question3() {
        /*
         * 问题3:模拟trim的功能,自定义实现 s="  安利给~   "
         */
        String s = "  安利给~   ";
        int left = 0;
        int right = s.length() - 1;
        while (s.charAt(left) == " ") {
            left++;
        }
        while (s.charAt(right) == " ") {
            right--;
        }
        String res = s.substring(left, right + 1);
        System.out.println("[" + res + "]");

    }

从头和尾分别开始,如果等于空格,那么一直向中间移动,最后记录两端不是空格的位置,用substring函数截取这一段即可。

第四题

/*
* 问题4:求S1和s2中最大的相同子串(s1.length()>s2.length())
* s1=“Python is a program language but is slow”;
* s2=“Java is a program language but is fast”;
*/

    public static void question4() {
        /*
         * 问题4:求S1和s2中最大的相同子串(s1.length()>s.length())
         * s1="Python is a program language but is slow";
         * s2="Java is a program language but is fast"; " is a program language but is "
         */
        final String s1 = "Python is a program language but is slow";
        final String s2 = "Java is a program language but is fast";
        boolean flag = true;
        for (int len = s2.length(); len >= 1; len--) {
            for (int i = 0, j = len - 1; j < s2.length(); j++, i++) {
                final String sub = s2.substring(i, j + 1);
                System.out.println(sub);
                if(s1.contains(sub)){
                    flag=false;
                    System.out.println("结果是["+sub+"]");
                    break;
                }
            }
            if(!flag){
                break;
            }
        }

用小的跟大的比,开始时看全部在不在里面,然后循环依次给长度减一,二层循环i从0开始,j从截取的长度开始,如果不包含就右移,直到j移动到了顶头,如果循环结束都没有找到,就输出了false,否则输出相应的字符串。

发布了39 篇原创文章 · 获赞 0 · 访问量 1380

猜你喜欢

转载自blog.csdn.net/qq_43199083/article/details/104323690