14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

  1. 输入:strs = ["flower","flow","flight"]
  2. 输出:"fl"
  • 思路解析

  1. string longestCommonPrefix(vector<string>& strs) {
  2. string res;
  3. if (strs.empty()) {
  4. return res;
  5. }
  6. for (size_t i = 0; i < strs[0].length(); i++) {
  7. char pivotChar = strs[0][i];
  8. for (size_t j = 1; j < strs.size(); j++) {
  9. if (i >= strs[j].length() || strs[j][i] != pivotChar) {
  10. return res;
  11. }
  12. }
  13. res += pivotChar;
  14. }
  15. return res;
  16. }

151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

  1. 输入:s = "the sky is blue"
  2. 输出:"blue is sky the"
  • 思路解析

  1. string reverseWords(string s) {
  2. stack<string> strStack;
  3. string oneWord;
  4. for (size_t i = 0; i < s.length(); i++) {
  5. if (s[i] == ' ') {
  6. if (!oneWord.empty()) {
  7. strStack.emplace(oneWord);
  8. }
  9. oneWord.clear();
  10. continue;
  11. }
  12. oneWord += s[i];
  13. }
  14. if (!oneWord.empty()) {
  15. strStack.emplace(oneWord);
  16. }
  17. string resStr;
  18. while (!strStack.empty()) {
  19. resStr += strStack.top() + " ";
  20. strStack.pop();
  21. }
  22. resStr = resStr.substr(0, resStr.length()-1);
  23. return resStr;
  24. }
graph LR;
ios-->ios_base;
istringstream-->istream;
istream-->ios;
ostream-->ios;
ostringstream-->ostream;
  • istream:从流中读取
  • ostream:写到流中去
  • istringstream:从string对象流中读取
  • ostringstream:写入到string对象流中

ostringstream:

Output stream class to operate on strings. 用于处理字符串的输出流

Objects of this class use a string buffer that contains a sequence of characters. This sequence of characters can be accessed directly as a string object, using member str.

ostringstream类的对象使用一个string buffer来存储一系列的字符,这些字符序列可以直接用string对象访问。

istringstream:

This operator (>>) applied to an input stream is known as extraction operator. It is overloaded as a member function for:

对输入流应用>>,即为提取操作符,有三种接受方式:

  • arithmetic types【算术类型,bool、short、long等等】
  • stream buffers
  • manipulators

使用>>可以从流中提取数据,多个单词使用空格分割。

  1. string reverseWords(string s) {
  2. istringstream is(s);
  3. stack<string> strStack;
  4. string str;
  5. while (is >> str) {
  6. strStack.emplace(str);
  7. }
  8. string resStr;
  9. while (!strStack.empty()) {
  10. resStr += strStack.top() + " ";
  11. strStack.pop();
  12. }
  13. resStr = resStr.substr(0, resStr.length() - 1);
  14. return resStr;
  15. }

125. 验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

  • 思路解析

  1. bool isPalindrome(string s) {
  2. // 清理字符串
  3. string cleanStr;
  4. for (size_t i = 0; i < s.length(); i++) {
  5. if (isalnum(s[i])) {
  6. cleanStr += tolower(s[i]);
  7. }
  8. }
  9. // 判断其是否为回文串
  10. int i = 0;
  11. int j = cleanStr.length() - 1;
  12. while (i < j) {
  13. if (cleanStr[i++] != cleanStr[j--]) {
  14. return false;
  15. }
  16. }
  17. return true;
  18. }

C++中哪些字符串的判断与处理函数:

  • int isalpha(int c);:判断一个字符是否为字母,是非零,否零
  • int isalnum(int c);:判断一个字符是否为字母或数字,是非零,否零
  • int isdigit(int c);:判断判断一个字符是否为数字,是非零,否零
  • int islower(int c);:判断判断一个字符是否小写字母,是非零,否零
  • int isupper(int c);:判断判断一个字符是否大写字母,是非零,否零
  • int tolower(int c);:将一个字母转为小写字母
  • int toupper(int c);:将一个字母转为大写字母

415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

  1. 输入:num1 = "11", num2 = "123"
  2. 输出:"134"
  • 思路解析

模拟加法的基本运算步骤。

  1. int charToInt(char c) {
  2. return c - '0';
  3. }
  4. string addStrings(string num1, string num2) {
  5. int i = num1.length() - 1;
  6. int j = num2.length() - 1;
  7. int jinwei = 0;
  8. stack<int> resStack;
  9. while (i >= 0 && j >= 0) {
  10. int tmp = charToInt(num1[i--]) + charToInt(num2[j--]) + jinwei;
  11. resStack.emplace(tmp % 10);
  12. jinwei = tmp / 10; // tmp >= 10 ? 1 : 0
  13. }
  14. while (i >= 0) {
  15. int tmp = charToInt(num1[i--])+ jinwei;
  16. resStack.emplace(tmp % 10);
  17. jinwei = tmp / 10;
  18. }
  19. while (j >= 0) {
  20. int tmp = charToInt(num2[j--]) + jinwei;
  21. resStack.emplace(tmp % 10);
  22. jinwei = tmp / 10;
  23. }
  24. if (jinwei) {
  25. resStack.emplace(jinwei);
  26. }
  27. string res;
  28. while(!resStack.empty()) {
  29. res += std::to_string(resStack.top());
  30. resStack.pop();
  31. }
  32. return res;
  33. }

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

  1. 输入: s = "abcabcbb"
  2. 输出: 3
  3. 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
  • 思路解析

使用滑动窗口来判断窗口内的子串是否为最长子串。

【找最长子串类似于找最大子数组的和,都需要考虑所有子串/子数组,就可以从每个元素开始找子串或子数组,就可以考虑用滑动窗口了】

设窗口为[left, right],针对当前元素s[right+1],如果该元素不在窗口内,则直接向右扩张窗口:right = right+1;否则,说明该元素之前出现过,判断其之前出现的位置是否在窗口内,如果不在,就不需要考虑,如果在,就需要收缩窗口的左侧边界,即left = 当前元素上次出现的索引位置 + 1;

  1. int lengthOfLongestSubstring(string s) {
  2. if (s.empty()) {
  3. return 0;
  4. }
  5. // 初始,窗口只有一个元素
  6. int left = 0;
  7. int right = 0;
  8. unordered_map<char, int> charIndexMap;
  9. charIndexMap[s[0]] = 0;
  10. int windowSize = 1;
  11. for (size_t i = 1; i < s.length(); i++) {
  12. // 当前字符出现过且在当前窗口内,则收缩窗口左边界
  13. if (charIndexMap.count(s[i]) != 0 && left <= charIndexMap[s[i]]) {
  14. left = charIndexMap[s[i]] + 1;
  15. }
  16. // 窗口一直在向右扩张
  17. right++;
  18. charIndexMap[s[i]] = i;
  19. // 判断窗口大小是否需要更新
  20. if (right - left + 1 > windowSize) {
  21. windowSize = right - left + 1;
  22. }
  23. }
  24. return windowSize;
  25. }

8. 字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  6. 返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

  1. 输入:s = " -42"
  2. 输出:-42
  3. 解释:
  4. 1 步:" -42"(读入前导空格,但忽视掉)
  5. ^
  6. 2 步:" -42"(读入 '-' 字符,所以结果应该是负数)
  7. ^
  8. 3 步:" -42"(读入 "42"
  9. ^
  10. 解析得到整数 -42
  11. 由于 "-42" 在范围 [-2^31, 2^31 - 1] 内,最终结果为-42
  • 0 <= s.length <= 200

  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-''.' 组成

  • 思路解析

判断输入的字符是否为数字,如果为数字就提取出来。

注意,从前到后,只能访问到' '、‘+’、‘-’或数字,其他的均为无效,"+"、"-"或数字一旦开始就不能再遇到其它了,只能遇到数字,否则就可以终止了。

举例说明:[比较重要的就是理解题意,将所有情况考虑周全]

  • "+-0012" --> 0
  • "+0012" --> 12
  • "+00 12" --> 0
  • " aa 12" --> 0
  • " 12 aa" --> 12
  1. int myAtoi(string s) {
  2. int sign = 1; // 符号位,默认为正
  3. bool startFlag = false; // "+"或"-"已经被遍历到,不能再出现了,再出现就属于不合法字符了
  4. int64_t intNum = 0;
  5. for (size_t i = 0; i < s.length(); i++) {
  6. if (isdigit(s[i])) {
  7. intNum = intNum * 10 + (s[i] - '0');
  8. if (sign == 1 && intNum > INT_MAX) {
  9. return INT_MAX;
  10. }
  11. if (sign == -1 && -intNum < INT_MIN) {
  12. return INT_MIN;
  13. }
  14. startFlag = true;
  15. } else if (s[i] == '-' && !startFlag) {
  16. startFlag = true;
  17. sign = -1;
  18. } else if (s[i] == '+' && !startFlag) {
  19. startFlag = true;
  20. } else if (s[i] == ' ' && !startFlag) {
  21. continue;
  22. } else {
  23. break;
  24. }
  25. }
  26. intNum = intNum * sign;
  27. if (intNum > INT_MAX) {
  28. return INT_MAX;
  29. }
  30. if (intNum < INT_MIN) {
  31. return INT_MIN;
  32. }
  33. return static_cast<int>(intNum);
  34. }

Leetcode Practice -- 字符串的更多相关文章

  1. Leetcode中字符串总结

    本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...

  2. LeetCode:字符串的排列【567】

    LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...

  3. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  4. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  5. LeetCode:字符串相加【415】

    LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...

  6. LeetCode之“字符串”:最短回文子串

    题目链接 题目要求: Given a string S, you are allowed to convert it to a palindrome by adding characters in f ...

  7. LeetCode之“字符串”:最长回文子串

    题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...

  8. LeetCode practice

    子集和问题:给定一组数和一个值,从这组数中选出若干个数使其和为给定的值.这是个NPC问题. 1.https://leetcode.com/problems/counting-bits/#/soluti ...

  9. LeetCode之字符串处理题java

    344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...

  10. c++ LeetCode (初级字符串篇) 九道算法例题代码详解(二)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11089327.html 已经刷了很多篇leetcode题了,不过最近在找c++的实习工作(大佬 ...

随机推荐

  1. 2022-07-09 第一小组 张明旭 前端HTML学习记录

    今天是正式学习的第一天,第一次接触前端内容,蒙了一圈又一圈,老师讲课速度是1000圈/s!!!!!!(插一句老师的打字和打代码速度起飞!) 好在有视频回放而且跟了笔记,能复习n遍.加油!!! 主要学习 ...

  2. oracle 锁用户和解锁。

    1 批量锁用户--数据库迁移后不允许在连接了 SELECT 'alter user '||username||' account lock;' from dba_users WHERE usernam ...

  3. 会话保持 Session和cookie

    Session是什么? Session在网络中称为会话控制,是服务器为了保护用户状态而创建的一个特殊的对象,简而言之,session就是一个对象,用于存储信息. Session有什么用? sessio ...

  4. 数组扩展(Java)

    Arrays类 基本介绍 数组的工具类java.util.Arrays 由于数组本身中没有什么方法可供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本操作 查 ...

  5. PDF转置

    import pdfplumber #全是None with pdfplumber.open(r"C:\Users\yjiang3\Desktop\Inv.pdf") as pdf ...

  6. 20181224蒋嘉豪-exp4

    20181224蒋嘉豪-exp4 目录 20181224蒋嘉豪-exp4 实验概况 1.实践目标 2.实践内容概述 知识点总结 1.有关schtasks 2.有关Sysmon(参考链接) 3.恶意代码 ...

  7. golang sync.WaitGroup错误使用导致死锁以及noCopy结构体介绍

    背景 项目中遇到死锁,使用搜索引擎搜索goroutine堆栈中出现的"sync.runtime_Semacquire deadlock"时,搜到一篇说sync.WaitGroup死 ...

  8. SQL Server之Cross apply

    1 --这样是不行的 2 select sys.dm_exec_sql_text(most_recent_sql_handle) from sys.dm_exec_connections 3 4 -- ...

  9. List转Map处理

    List对象装一个Map<String,String> 在Java8中新增了stream流的操作,对于代码书写更为简便,而且更容易看的懂 List<Unit> unitList ...

  10. 去除python中数据的0值

    import numpy as np a = [0, 1, 2] a = np.array(a) a = a[a != 0].tolist() print(a) //a = [1, 2]