问题描述:输入两个字符串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.
此问题还可以加以扩展,比如替换字符串等。