zoukankan      html  css  js  c++  java
  • 第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 }

    程序运行结果如下:

    可以通过循环移位得到!

    总结

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

  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4649616.html
Copyright © 2011-2022 走看看