字符替换问题

问题描述:输入两个字符串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.

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

原文地址:https://www.cnblogs.com/guozhenqiang/p/5467473.html