【每日挠头算法题(5)】重新格式化字符串|压缩字符串

简介: 【每日挠头算法题(5)】重新格式化字符串|压缩字符串

一、重新格式化字符串

点我直达~

思路1:构造模拟

  • 1.遍历字符串,将数字字符和字母字符分别放在不同的字符串
  • 2.如果|字母字符数量 - 数字字符数量| > 1 ,则无法实现格式化,返回""
  • 3.如果不是2.中的情况,则偶数为字符必须放数量多的字符串对应的字符(下标从0开始)。
  • 将数量多的字符串对应的字符和数量少的字符串对应的字符交叉逐个放回到原字符串即可。

具体代码如下:

class Solution {
public:
    string reformat(string s) 
    {
        string letter,num;
        for(int i = 0;i<s.size();++i)
        {
            if(s[i] >= 'a' && s[i] <='z')
                letter+=s[i];
            else
                num+=s[i];
        }
        int lenl = letter.size();
        int lenn = num.size();
        //字母个数和数字个数的差值大于1,不管怎么排,都一定有连续的类型出现
        if(abs(lenl - lenn) > 1 )
            return "";
        int i = 0,numi = 0,letteri = 0;
        while(i < s.size())            
        {
            if(letter.size() > num.size())
            {
                s[i++] = letter[letteri++];
                s[i++] = num[numi++];
            }
            else
            {
                s[i++] = num[numi++];
                s[i++] = letter[letteri++];
            }
        }
        return s;
    }
};

时间复杂度O(n),空间复杂度O(n)


思路2:双指针法

  • 1.遍历字符串,将数字字符和字母字符分别放在不同的字符串
  • 2.如果|字母字符数量 - 数字字符数量| > 1 ,则无法实现格式化,返回""
  • 3.字符数量多的字符串有优先权,偶数位必须放字符数量多的字符,(下标从0开始),下标分别记为i = 0,j = 1
  • 4.遍历s,如果s[i]不是数量多的字符,则从j开始往后遍历,知道找到第一个是数量多的字符,与s[i]叫交换
  • 5.依次往后遍历,直到 i到末尾结束。

具体代码如下:

string reformat(string s) 
    {
        // //法2:双指针
        // //1.遍历字符串,计算数字和字符分别有多少
        int lend = 0,lena = 0;
        for(int i = 0;i<s.size();++i)
        {
            if(s[i] >='0' && s[i]<='9')
                ++lend;
        }
        lena = s.size() - lend;
        //字母个数和数字个数的差值大于1,不管怎么排,都一定有连续的类型出现
        if(abs(lend-lena) > 1)
            return "";
        //字符多的要放在第一位
        bool flag = lend > lena;
        for(int i = 0,j = 1;i<s.size();i+=2)
        {
            //如果偶数位不是放数量多的,那就要从奇数位开始找这个数量多的字符
            //下标从0开始
            if(isdigit(s[i]) != flag)
            {
                while(j<s.size())
                {
                    if(isdigit(s[j]) == flag)
                    {
                        swap(s[i],s[j]);
                        break;
                    }
                    j+=2;
                }
            }
        }
        return s;
    }
};

二、字符串压缩

点我直达~

思路1:简单替换

  • 1.开辟一块同S大小的空间,遍历S字符串,如果S[i] !=S[i+1]或者i == S.size() -1,说明下标遇到了某一个相同子串的终点或者遇到字符串末尾,此时将对应的子串的字符和长度追加到开辟好的字符串s中。
  • 2.如果新开辟的字符串长度大于原来的字符串,则压缩失败,返回原来的字符串。
  • 3.否则返回新的字符串

具体代码如下:

//写了这道题才发现有一个函数叫做to_string(),将任意一个东西转成字符串
//
class Solution {
public:
    string compressString(string S)
    {
        string s;
        int len = 0;
        for (int read = 0; read < S.size(); ++read)
        {
            ++len;
            if (S[read] != S[read + 1] || read == S.size() - 1)
            {
                s +=S[read];
                s += (to_string(len));
                len = 0;
            }
        }
  return S.size() > s.size()? s:S ; 
    }
};

时间复杂度O(n),空间复杂度O(n)

总结

  • 1.今天写得两道字符串的题目,其中一道题目是关于字符串的压缩的,对于这道题,刚开始绞尽脑汁都不知道如何原地覆盖原字符串,后来发现好像也不用这样原地覆盖,第二个出现的问题是,如果某个字符出现的次数大于10次该怎么处理。在这里我已经被之前写过的一道类似的压缩字符串的题目给洗脑了,用了短除法存储,再逆置,但是我不会啊。。后面发现之前写的题是将字符的长度放在顺序表中的,而这道题是直接用string构造的,可以调用operator+=,终于解决了这道题。
  • 2.关于字符串的重新格式化,这道题比较好解决,可以使用双指针,还可以用模拟构造两个字符串空间来进行存储,直接就过了哈哈。
相关文章
|
11天前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
181 1
|
13天前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
5天前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
13 1
|
5天前
|
算法 Java 程序员
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
8 0
|
19天前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集
|
21天前
|
算法 Java
Java数据结构与算法:字符串匹配算法之暴力匹配
Java数据结构与算法:字符串匹配算法之暴力匹配
|
21天前
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法
|
1月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
1天前
|
算法 数据安全/隐私保护
基于GA遗传优化算法的Okumura-Hata信道参数估计算法matlab仿真
在MATLAB 2022a中应用遗传算法进行无线通信优化,无水印仿真展示了算法性能。遗传算法源于Holland的理论,用于全局优化,常见于参数估计,如Okumura-Hata模型的传播损耗参数。该模型适用于150 MHz至1500 MHz的频段。算法流程包括选择、交叉、变异等步骤。MATLAB代码执行迭代,计算目标值,更新种群,并计算均方根误差(RMSE)以评估拟合质量。最终结果比较了优化前后的RMSE并显示了SNR估计值。
15 7
|
4天前
|
算法 数据挖掘
MATLAB数据分析、从算法到实现
MATLAB数据分析、从算法到实现