zoukankan      html  css  js  c++  java
  • 字符替换问题

    问题描述:输入两个字符串str1和p,将str1中的某个字符替换为字符串p。

    分析:这个问题其实就是编程语言里的字符替换库函数,我们需要自己去实现,需要找出一种高效的办法,对于这道题存在两种解法。

            解法一:从头开始扫描字符串str1,每次遇到空格后,插入字符串P,再插入字符串P之前,需要先将空格后面的字符往后挪位,然后在将P插入即可。

                       此方法很直观,也很容易想到,但是时间复杂度却达到了O(n^2),效率很低。

           解法二:从尾到头扫描,刚看到这里读者会以为是一样的,只不过是从后面开始而已,其实不然,下面具体分析,

                      1. 我们可以先求出字符串中的特定字符出现的次数,这里我们以空格为例,然后求出插入字符串P后最后字符串的长度。

                      2.设置两个指针,p1和p2,p1指向原来字符串的末尾,p2指向最终字符串的末尾

                      3.然后p1开始向左移动,如果p1所指字符不是空格,则将该字符复制到p2所指位置处,p1和p2都向左移动一位;

                                                     如果p1所指字符是空格,则此时将P字符串倒序插入p2所指位置处,直到插入完毕,然后p1向左移动一位。

                      4.直到p1==p2时,表明所有的字符替换完毕。

                      此方法的时间复杂度为O(n),是不是比解法一要简单的多啊,读者应该掌握这种方法。

            通过这道题目,可以发现有时候逆向思维可以是问题简单化!

    对于解法一,我不在去写示例代码了,针对解法二,我写出了如下Java代码供读者参考,程序中我以替换空格为例:

     1 public class Main {
     2     public static String  tihuan(String str,String p){
     3         String str1=new String("");           
     4         if(str==null || p==null)                  //如果字符串或者空格替换符字符串为空引用,则直接返回空字符串
     5             return str1;     
     6         int n1=str.length(),n2=p.length();        
     7         if(n1==0)return str1;                     //如果字符串为空字符串,则返回空字符串
     8         int sum=0;                                //用来统计空格数量
     9         for(int i=0;i<n1;i++)
    10             if(str.charAt(i)==' ')sum++;
    11         char ch[]=new char[n1+sum*(n2-1)];        //替换后的字符串的长度
    12         for(int i=0;i<n1;i++)
    13             ch[i]=str.charAt(i);
    14 
    15         int p1=n1-1,p2=ch.length-1;               //设置两个指针
    16         while(p1>=0 && p2>=0&& p1!=p2)
    17         {
    18             if(ch[p1]!=' ')ch[p2--]=ch[p1--];     
    19             else 
    20             {
    21                 for(int i=n2-1;i>=0;i--)
    22                      ch[p2--]=p.charAt(i);
    23                   p1--;
    24             }
    25         }
    26         for(int i=0;i<ch.length;i++)              //把字符数组中的字符复制到字符串中
    27             str1+=ch[i];
    28         return str1;
    29     }
    30     
    31     public static void main(String[] args) {
    32         // TODO 自动生成的方法存根
    33        String str=new String("I am happy.");
    34        String p=new String("***");
    35        System.out.println(tihuan(str,p));
    36     }
    37 
    38 }

    输出结果为:

    I***am***happy.

    此问题还可以加以扩展,比如替换字符串等。读者可以自己思考,但其基本思想和本问题相似。如有问题,可以给我留言!

  • 相关阅读:
    >动态规划 4.26
    树链剖分+线段树求路径交
    PTA团体程序设计天梯赛-练习集 L2 网红点打卡攻略(模拟)
    PTA团体程序设计天梯赛-练习集 L2完全二叉树的层序遍历(递归)
    PTA团体程序设计天梯赛-练习集 L3-020 至多删三个字符 (dp)
    codeforces1509 D. Binary Literature (构造+指针)
    函数内容小结
    关于vim复制剪贴粘贴命令的总结-转
    GCC编译命令常用选项
    Ubuntu 和 windows1下文件夹共享的指令
  • 原文地址:https://www.cnblogs.com/guozhenqiang/p/5467473.html
Copyright © 2011-2022 走看看