• 【算法】【字符串模块】替换字符串中连续出现的指定字符串


    前言

    当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

    在此感谢左大神让我对算法有了新的感悟认识!

    问题介绍

    原问题
    给定一个字符串str,再给两个字符串from和to,将str中出现过的from子串全都替换成to
    如下:
    str = abc123123, from = 123, to=x
    结果为abc123

    解决方案

    原问题
    1、将str中的from子串全部替换为0
    2、再将连续的0替换为一个0
    3、再将0全部替换为to字符串

    代码编写

    java语言版本

    原问题:

         /**
         * 二轮测试:替换
         * @param str
         * @param from
         * @param to
         * @return
         */
        public static String replaceCp1(String str, String from, String to) {
            if (str == null || from == null || to == null
                    || str.length() == 0 || from.length() == 0 || to.length() == 0){
                return null;
            }
            char[] chars = str.toCharArray();
            char[] charsFrom = from.toCharArray();
    
            for (int i = 0; i < chars.length; i++) {
                if (chars[i] == charsFrom[0]) {
                    int index = 0;
                    while (index < charsFrom.length && index < chars.length) {
                        if (charsFrom[index] != chars[i+index]) {
                            break;
                        }
                        index++;
                    }
                    if (index == charsFrom.length) {
                        // 说明全部相等.匹配成功
                        int tmp = 0;
                        while (tmp < index) {
                            chars[i + tmp] = 0;
                            tmp++;
                        }
                    }
                    // 结束之后,i调整为index
                    i = index;
                }
            }
            // chars中的0全部替换成to,连续的算一个
            int start = -1;
            int index = 0;
            char[] res = new char[chars.length];
            for (int j = 0 ; j < chars.length; j++) {
                if (chars[j] == 0) {
                    if (start == -1) {
                        start = j;
                        res[index++] = 0;
                    }
                }else {
                    res[index++] = chars[j];
                    start = -1;
                }
            }
    
            return String.valueOf(res, 0, index).replace("\u0000", to);
        }
    
    
        public static void main(String[] args) {
            System.out.println(replaceCp1("123abcabc", "abc", "x"));
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    c语言版本

    正在学习中

    c++语言版本

    正在学习中

    思考感悟

    字符串类型的题目虽然简单,但是也是在业务中用到很多的部分,比如url的替换和ip地址的转换等很多业务都会涉及到字符串的预处理,虽然我们知道spring等框架都有工具方法,但是自己实现一遍再去看大佬们写的工具方法,对比下来才能看出自己代码精简程度和不足之处,比如上面的写法就是我个人随手写的,有很多地方可以优化的,大家可以引以为戒哈~

    写在最后

    方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
    如果需要git源码可邮件给2260755767@qq.com
    再次感谢左大神对我算法的指点迷津!

  • 相关阅读:
    图解redis(二)——持久化篇
    【区块链实战】Solidity 智能合约如何给账户充值
    java面试
    鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换
    “香蕉大王”的转型升级,能否扩大市场份额?
    在 msys2/mingw 下安装及编译 opencv
    exe4j使用笔记(jar包转exe工具)
    centos7安装git客户端
    java计算机毕业设计客户关系智能管理系统源码+mysql数据库+系统+lw文档+部署
    LeetCode刷题系列 -- 678. 有效的括号字符串
  • 原文地址:https://blog.csdn.net/qq_39760347/article/details/128193506