• 第3章 结构之法——字符串移位包含的问题


    字符串移位包含的问题

    问题描述

    分析与解法

    【解法一】

    具体代码如下:

     1 package chapter3jiegouzhifa.QuestionOfStringMove;
     2 /**
     3  * 字符串移位包含的问题
     4  * 【解法一】
     5  * @author DELL
     6  *
     7  */
     8 public class StringMove {
     9     /**
    10      * 寻找移位后的字串(左移)
    11      * @param src 源字符串
    12      * @param des 要查找的子串
    13      * @return
    14      */
    15     public static boolean findSubStr(String src1, String des){
    16         char[] src = src1.toCharArray();
    17         int n = src.length;
    18         for(int i=0;i<n;i++){
    19             StringBuffer sb = new StringBuffer();  //用于存放移位后的字符串
    20             char temp = src[0];
    21             for(int j=0;j<n-1;j++){
    22                 src[j] = src[j+1];
    23                 sb.append(src[j+1]);
    24             }
    25             src[n-1] = temp;
    26             sb.append(temp);
    27             //判断是否包含
    28             if(sb.toString().contains(des))
    29                 return true;
    30         }
    31         return false;
    32     }
    33     public static void main(String[] args) {
    34         String src = "AABCD";
    35         String des = "CDAA";
    36         if(findSubStr(src,des))
    37             System.out.println("可以通过循环移位得到!");
    38         else
    39             System.out.println("不可以通过循环移位得到!");
    40     }
    41 
    42 }

    程序运行结果如下:

    可以通过循环移位得到!

    【解法二】

    这种解法存在一个bug:s1="A", s2="AA". 解决办法:先比较一下长度。

    具体代码如下:

     1 package chapter3jiegouzhifa.QuestionOfStringMove;
     2 /**
     3  * 字符串移位包含的问题
     4  * 【解法二】
     5  * @author DELL
     6  *
     7  */
     8 public class StringMove2 {
     9     /**
    10      * 寻找移位后的字串(左移)
    11      * @param src 源字符串
    12      * @param des 要查找的子串
    13      * @return
    14      */
    15     public static boolean findSubStr(String src, String des){
    16         if(src.length()<des.length())
    17             return false;
    18         StringBuffer sb = new StringBuffer(); 
    19         sb.append(src);
    20         sb.append(src);
    21         //判断是否包含
    22         if(sb.toString().contains(des))
    23             return true;
    24         else
    25             return false;
    26     }
    27     public static void main(String[] args) {
    28         String src = "AABCD";
    29         String des = "CDAA";
    30         if(findSubStr(src,des))
    31             System.out.println("可以通过循环移位得到!");
    32         else
    33             System.out.println("不可以通过循环移位得到!");
    34     }
    35 
    36 }

    程序运行结果如下:

    可以通过循环移位得到!

    总结

      第二种方法利用了“提高空间复杂度来换取时间复杂度的降低”的思路,适用于对时间复杂度要求高的场合。

  • 相关阅读:
    单调队列 POJ 2823
    大组合数取mod lucas 定理
    多校4
    多校2
    2016多校1
    百度之星 初赛B续
    iot-web增加apis-namespace组件
    25.75k8s
    新项目增加gradlew
    vue图片点击放大预览v-viewer
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4649616.html
Copyright © 2020-2023  润新知