【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串

简介: 【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串

一、最后一个单词的长度

点我直达~

思路1:从后往前遍历

  • 从后往前遍历,先找到最后一个字母,然后继续往前遍历,直到遇到空格,返回长度即可。
  • 具体情况如下:
  • 如果从后往前开始遍历到的是空格,跳过即可。
  • 如果不是,那就直接开始计数,从最后一个字母开始,计算完一定会遇到空格或者字符串的开始位置,即下标0位置处,返回长度即可。

具体代码如下:

class Solution {
public:
//思路:从后往前遍历,先找到最后一个字母,然后继续往前遍历,直到遇到空格,返回长度即可。
    int lengthOfLastWord(string s) 
    {
        //情况1:
        //如果从后开始是空格,那就跳过
        int end = s.size() -1;
        while(s[end]==' ')
            --end;
        //此时遇到了最后一个单词的最后一个字母
        int len = 0;
        while(end>=0 && s[end]!=' ')
        {
            ++len;
            --end;
        }
        return len;
    }
};

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

思路2:

这个思路看看就行,不太推荐。

  • 大致情况是一样的,但有一点不同。
  • 我们知道,每两个单词之间必有空格,所以我们可以这样操作:
  • 从后往前遍历,如果第i个位置是字符,并且第i-1个位置是空格,则说明i位置是最后一个单词的最开始的字母,到此刻就停下来即可。
  • 然而面对下面的情况就有心无力了:
  • 只有一个单词,没有任何其他的空格怎么办呢,我们就主动在该字符串的最开始位置加一个空格。
  • 添加空格之前需要整体将字符串往后挪一位。
  • 比如Hello,变成了 Hello

这样就可以了。

具体代码如下:

class Solution {
public:
    int lengthOfLastWord(string s) 
    {
        int len = 0;
        int flag = 0;
        //手动在后面开一个空间,再向后挪动数据。
        //然后在0位置处加一个'\0'
        s.push_back(' ');
        for(int i = s.size()-1;i>0;--i)
        {
            s[i] = s[i-1];
        }
        s[0] = ' ';
        for(int i = s.size()-1;i>=0;--i)
        {
            //如果一开始就是空格,跳过即可,直到遇到字母。
            //计算完最后一个单词的长度后,后面肯定是空格
            if(isalpha(s[i]))
            {
                ++len;
                if(s[i-1] == ' ')
                    break;
            }
        }
        return len;
    }
};

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

二、重新排列字符串

点我直达~

思路

  • 对于任意一组数据,比如

45670213

codeleet

  • 我们需要做的是:
  • 把下标4对应的字符c放到一个新的string的下标4位置处。

就完成了。

过程如下:

具体代码如下:

//思路,顺序表(indices)中的第i个元素是多少,就放到对应的ret的ret[indices[i]]的位置上,这个位置就放s[i]
//比如s[0]的字符c,对应的indices[0] = 4,那就将字符'c'放入到ret的第4个下标位置。
//时间复杂度O(N),空间复杂度O(N)
    string restoreString(string s, vector<int>& indices) 
    {
        //首次开辟s.size()大小的空间,初始化成任何字符均可。
        string ret(s.size(),'a');
        for(int j =0; j < s.size(); ++j)
        {
            ret[indices[j]] = s[j];
        }
        return ret;
    }
};

注意:

这里的string ret(s.size(),‘a’);

是初始化一个string类ret,给定s.size()大小的空间

具体的重载如上,其中后面的字符不管初始化成什么均可。

时间复杂度:O(n),遍历字符串的长度个字符,空间复杂度O(n),需要新开辟n大小的空间。

相关文章
|
3月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
29天前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
60 1
两个字符串匹配出最长公共子序列算法
|
3月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
4月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
264 1
|
4月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
110 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
3月前
|
算法 容器
【算法】滑动窗口——串联所有单词的子串
【算法】滑动窗口——串联所有单词的子串
|
3月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
53 0
|
3月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
74 0
|
4月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
5月前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集