力扣 字符串题目总结
Posted 行码阁119
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣 字符串题目总结相关的知识,希望对你有一定的参考价值。
有些字符串的题是真的烦,这些题既可以有动态规划,滑动窗口来做,也可以用回溯,反正乱七八糟,还有些就是硬钢,无套路而言,就算会做,也会浪费大把时间,在这里我将分开总结,也会持续更新。
1、动态规划
2、滑动窗口
3、乱七八糟
题1:剑指 Offer 67. 把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: "42"
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。
示例 5:
输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
//作者写的代码
//难点在于对于出界的判断
class Solution
public:
int strToInt(string str)
int i = 0;
for(; i <str.size(); i++)
if(str[i] != ' ')
break;
str = str.substr(i, str.size() - i);
if(str.size() == 0 || (str[0] != '+' && str[0] != '-' && (str[0] < '0' || str[0] > '9'))) return 0;
string mys;
mys += str[0];
for(int i = 1; i < str.size(); i++)
if(str[i] < '0' || str[i] > '9' ) break;
mys += str[i];
int sum = 0;
int t = 1;
int bundy = 2147483647 / 10;
for(int i = 0; i < mys.size(); i++)
if(abs(sum) > bundy || (abs(sum) == bundy && (mys[i] - '0') > 7))
if(t == 1)
return 2147483647*t;
else return 2147483648*t;
sum = sum * 10;
if(mys[i] == '+') t = 1;
else if(mys[i] == '-') t = - 1;
else
sum += (mys[i] - '0')*t;
return sum;
;
题目2:剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = " .1 "
输出:true
//作者自己写的代码
//运行不成功
class Solution
public:
bool isNumber(string s)
int start = 0;
int end = s.size() - 1;
for(; start < s.size(); start++)
if(s[start] != ' ')
break;
for(; end >=0; end--)
if(s[end] != ' ')
break;
if(end < start) return false;
s = s.substr(start, end - start + 1);
if(s.size() == 1 && s[0] == '.') return false;
unordered_map<char, int> map;
for(int i = 0; i < s.size(); i++)
if((s[i] == '+' || s[i] == '-') && (( i > 0 && tolower(s[i - 1]) != 'e') || i == s.size() - 1))
return false;
if(tolower(s[i]) == 'e' && ( map.count('.') || map.count(s[i]) || i == (s.size() - 1) || i == 0 || map.count(' ')))
return false;
if(s[i] == '.' && (map.count(s[i]) || map.count('e')))
return false;
if(tolower(s[i]) >= 97 && tolower(s[i]) <= '122' && tolower(s[i]) != 'e')
return false;
if(s[i] == ' ') return false;
char t = tolower(s[i]);
map[t] = i;
return true;
;
可以运行成功的代码,太难的 舍弃
class Solution
public:
enum State
STATE_INITIAL,
STATE_INT_SIGN,
STATE_INTEGER,
STATE_POINT,
STATE_POINT_WITHOUT_INT,
STATE_FRACTION,
STATE_EXP,
STATE_EXP_SIGN,
STATE_EXP_NUMBER,
STATE_END
;
enum CharType
CHAR_NUMBER,
CHAR_EXP,
CHAR_POINT,
CHAR_SIGN,
CHAR_SPACE,
CHAR_ILLEGAL
;
CharType toCharType(char ch)
if (ch >= '0' && ch <= '9')
return CHAR_NUMBER;
else if (ch == 'e' || ch == 'E')
return CHAR_EXP;
else if (ch == '.')
return CHAR_POINT;
else if (ch == '+' || ch == '-')
return CHAR_SIGN;
else if (ch == ' ')
return CHAR_SPACE;
else
return CHAR_ILLEGAL;
bool isNumber(string s)
unordered_map<State, unordered_map<CharType, State>> transfer
STATE_INITIAL,
CHAR_SPACE, STATE_INITIAL,
CHAR_NUMBER, STATE_INTEGER,
CHAR_POINT, STATE_POINT_WITHOUT_INT,
CHAR_SIGN, STATE_INT_SIGN
,
STATE_INT_SIGN,
CHAR_NUMBER, STATE_INTEGER,
CHAR_POINT, STATE_POINT_WITHOUT_INT
,
STATE_INTEGER,
CHAR_NUMBER, STATE_INTEGER,
CHAR_EXP, STATE_EXP,
CHAR_POINT, STATE_POINT,
CHAR_SPACE, STATE_END
,
STATE_POINT,
CHAR_NUMBER, STATE_FRACTION,
CHAR_EXP, STATE_EXP,
CHAR_SPACE, STATE_END
,
STATE_POINT_WITHOUT_INT,
CHAR_NUMBER, STATE_FRACTION
,
STATE_FRACTION,
CHAR_NUMBER, STATE_FRACTION,
CHAR_EXP, STATE_EXP,
CHAR_SPACE, STATE_END
,
STATE_EXP,
CHAR_NUMBER, STATE_EXP_NUMBER,
CHAR_SIGN, STATE_EXP_SIGN
,
STATE_EXP_SIGN,
CHAR_NUMBER, STATE_EXP_NUMBER
,
STATE_EXP_NUMBER,
CHAR_NUMBER, STATE_EXP_NUMBER,
CHAR_SPACE, STATE_END
,
STATE_END,
CHAR_SPACE, STATE_END
;
int len = s.length();
State st = STATE_INITIAL;
for (int i = 0; i < len; i++)
CharType typ = toCharType(s[i]);
if (transfer[st].find(typ) == transfer[st].end())
return false;
else
st = transfer[st][typ];
return st == STATE_INTEGER || st == STATE_POINT || st == STATE_FRACTION || st == STATE_EXP_NUMBER || st == STATE_END;
;
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/biao-shi-shu-zhi-de-zi-fu-chuan-by-leetcode-soluti/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于力扣 字符串题目总结的主要内容,如果未能解决你的问题,请参考以下文章