博客
关于我
Leetcode 面试经典01.05 一次编辑 & 01.06 字符串压缩(C/C++)
阅读量:595 次
发布时间:2019-03-11

本文共 2435 字,大约阅读时间需要 8 分钟。

01.05 一次编辑

首先,让我们看看怎么判断两个字符串只需要一次编辑操作或者没有编辑操作即可。具体想法如下:

思考过程:两个字符串可能只需要一次编辑,或者根本不需要编辑。比如,如果两个字符串完全相同,就是不需要编辑的;如果只插入、删除或替换一个字符就能让它们相等,也就是只需要一次编辑。

实现思路:我们可以用双指针的方法,一边从头向前遍历,另一边从尾向后遍历。一旦发现两个字符不一样,就分别统计从后面开始到不一样处的字符数。然后判断前面和后面剩下的字符数是否都小于等于1。总的情况,其实可以分为以下几种:

  • 两个字符串的长度相差0,则返回true;
  • 两个字符串的长度相差1,将较长的字符串缩短1,和另一个字符串比较;
  • 如果两个字符串之间只相差一个位置的不同,且差异的位置只有一处,那么返回true。
  • 代码示例:

    public class Solution {    public static boolean oneEditAway(String first, String second) {        if (first.equals(second)) {            return true;        }        int len1 = first.length();        int len2 = second.length();        if (Math.abs(len1 - len2) > 1) {            return false;        }        int i = 0;        int j = len1 - 1;        int k = len2 - 1;        // 前进指针遍历前方        while (i < len1 && i < len2 && first.charAt(i) == second.charAt(i)) {            i++;        }        // 后退指针遍历后方        while (j >= 0 && k >= 0 && first.charAt(j) == second.charAt(k)) {            j--;            k--;        }        // 判断是否只相差一个字符        return (j >= i - 1 && k >= i - 1);    }}

    也就是说,上面的算法比较简单直接地用两个指针分别从前往后和从后往前扫描,一旦发现不同就立即终止,然后再检查剩下的部分是否可以通过一次编辑操作来统一。

    01.06 字符串压缩

    接下来,我们来看看如何压缩字符串。简单地说,压缩的意思就是说,记录重复的字符。比如 aabbbc 可以被压缩成 a2b3c。如果压缩后的字符串长度不比原字符串短,那就返回原字符串。

    思考过程:需要一个方法来遍历字符串,记录每个字符连续出现的次数,然后把这个信息记录下来。比如,我们可以用双指针法,记录当前字符的起始位置和结束位置。一旦遇到不同的字符,就输出当前字符和出现的次数。

    实现步骤:

  • 初始化一个结果字符串;
  • 设置初始指针i=0;
  • 循环遍历字符串,直到字符串的末尾;
  • 记录当前字符的起始位置为i,然后在字符串中找到当前字符的结束位置j,循环判断;
  • 把当前字符和j-i的长度记录到结果字符串中;
  • 更新i=j;
  • 循环结束后,比较结果字符串和原字符串的长度,如果结果更短,就返回结果字符串,否则直接返回原字符串。
  • 代码示例:

    public class StringUtil {    public static String compressString(String S) {        int count = 0;        int n = S.length();        if (n == 0) {            return "";        }        StringBuilder result = new StringBuilder();        char currentChar = S.charAt(0);        count++;        for (int i = 1; i < n; i++) {            if (S.charAt(i) == currentChar) {                count++;            } else {                result.append(currentChar);                result.append(count);                currentChar = S.charAt(i);                count = 1;            }        }        // 最后还要处理最后一组字符        result.append(currentChar);        result.append(count);        // 如果压缩后的长度比原来长,则返回原字符串        return result.length() < n ? result.toString() : S;    }}

    上述代码的思路非常直观:

  • 首先设置一个双重循环,一次遍历整个字符串;
  • 记录当前字符的出现次数;
  • 在遇到不同的字符时,将当前字符及其次数记录到结果字符串中,然后重置当前字符和计数器;
  • 最后在外循环中处理最后一个字符组;
  • 最后比较压缩后的字符串长度,如果比原来短,则返回压缩结果,否则返回原字符串。
  • 这种方法的时间复杂度是O(n),所以非常高效。

    转载地址:http://gzhtz.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NHibernate学习[1]
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>