问题描述:输入两个字符串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.
此问题还可以加以扩展,比如替换字符串等。读者可以自己思考,但其基本思想和本问题相似。如有问题,可以给我留言!