学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

题目链接:
替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are
Happy.则经过替换之后的字符串为We%20Are%20Happy。

注意:C++解法中,给定的字符串结尾后面还有一定的空间,不然我们还得重新给它分配足够的内存空间才能将空格换成%20。在写题过程中,我们需要判断替换后的字符串是否会超过给定的内存空间长度,超过了就直接返回。Java解法需要自己重新分配内存空间。

解题思路

O(n2)的思路就不写了,直接就是从前开始遍历,遇到空格就将后面所有剩余的字符串往后移动两个位置,然后前面的空格后面就多了两个空位置,写上%20即可。

O(n)的解法:
这种题型,要很容易想到从后往前扫描字符串。我们可以这样:先计算出该字符串有几个空格,然后算出替换后的字符串一共需要多少空间的长度。我们从字符串的后面开始准备复制和替换。可以看以下图示过程:

其中,p2是指向替换后字符串的结尾处应该在哪里,p1是指向替换前,字符串的结尾处。

我们从字符串的后面开始复制和替换,当p1指向的是字符,则将字符复制给p2位置。同时,p1和p2同时向前移动。当p1遇到空格,则p2处赋值字符’0’;p2再向前移动一格,p2处赋值字符’2’;p2再向前移动一格,p2处赋值字符’%’。然后p1和p2再同时向前移动一格。以此类推最终将所有空格替换完成。

java代码:

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	int knum=0;
        /*计算空格的数量与字符串的长度*/
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' ')
                knum++;
        }
        /* 替换空格后的字符串的长度 */
        int newlen=str.length()+2*knum;
        int p1=str.length()-1,p2=newlen-1;
        str.setLength(newlen);
        while(p1>=0 && p2>p1){s
            if(str.charAt(p1)==' '){
                str.setCharAt(p2--, '0');
                str.setCharAt(p2--, '2');
                str.setCharAt(p2--, '%');
                --p1;
            }else{
                str.setCharAt(p2--, str.charAt(p1--));
            }
        }
        return str.toString();
    }
}

C++代码:

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int strlen=0,knum=0,i=0;
        /*计算空格的数量与字符串的长度*/
        while(str[i]!='\0'){
            strlen++;
            if(str[i]==' ') ++knum;
            i++;
        }
        /* 替换空格后的字符串的长度 */
        int newlen=strlen+2*knum;
        /* 如果替换后的长度超过了给出的固定长度则返回 */
        if(newlen>length)return;
        int p1=strlen,p2=newlen;
        while(p1>=0 && p2>p1){
            if(str[p1]==' '){
                str[p2--]='0';
                str[p2--]='2';
                str[p2--]='%';
                --p1;
            }
            else{
                str[p2--]=str[p1--];
            }
        }
	}
};

总结

遇到这种字符串替换的问题,如果时间复杂度达到O(n2),则考虑从后往前替换。同时注意要将复制的过程用图示画出来,才不会导致编程出错。

探讨学习加:
qq:1126137994
微信:liu1126137994