算法刷题之字符串
杰明学编程
这个作者很懒,什么都没留下…
展开
-
9. 回文数
代码完整版:#include<iostream>#include <cstring>#include <stdlib.h>using namespace std;int fun(string &s,int n){ int left=0; int right=-1; int h[256]={0}; int res=0; while(left<n) { if(h[s[right+1]]==0&&right+1&l原创 2020-09-15 10:43:12 · 147 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。题解思路:方法:求余法1.新建一个string srt="";然后利用求余法遍历字符串,在添加字符串到str中。函数代码:class Solution {public: string reverseLeftWords(string s, int n) { stri原创 2020-09-15 01:29:36 · 101 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
函数代码:class Solution {public: int myAtoi(string str) { int flag=true; int i=0; while(str[i]==' ') { i++; } if(str[i]=='-') { flag=false; } if(str[i]=='-'||原创 2020-09-14 22:59:25 · 133 阅读 · 0 评论 -
139. 单词拆分
题目:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。方法一:动态规划函数代码:class Solution {public: bool wordBreak(string s, vector<string>& wordDict) { auto wordDictSet = unordered_se原创 2020-09-08 17:47:06 · 93 阅读 · 0 评论 -
516. 最长回文子序列
题目:给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。题解思路:方法一:动态规划函数代码:class Solution {public: int longestPalindromeSubseq(string s) { int n=s.size(); vector<vector<int>>dp(n,vector<int>(n,0)); for(原创 2020-09-08 01:40:17 · 77 阅读 · 0 评论 -
1143. 最长公共子序列
题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。题解思路:方法一:动态规划函数代码:class Solutio原创 2020-09-08 01:40:22 · 81 阅读 · 0 评论 -
3. 无重复字符的最长子串
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。题解思路:方法一:滑动窗口函数代码:class Solution {public: int lengthOfLongestSubstring(string s) { int n=s.size(); int freq[256]={0}; int l=0,r=-1; int res=0; while(l<n) {原创 2020-09-02 00:33:15 · 94 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。题解思路:方法一:栈和istringstream结合函数代码:class Solution {public: string reverseWords(string s) { stack<string> stk; string res,str原创 2020-09-01 01:02:30 · 99 阅读 · 0 评论 -
344. 反转字符串
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。题解思路:方法一:原地回转函数代码:class Solution {public: void reverseString(vector<char>& s) { int i=0;原创 2020-09-01 00:37:58 · 88 阅读 · 0 评论 -
28. 实现 strStr()
题目:实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。题解思路:方法一:BF算法 暴力破解:1.用双指针i,j分别代表haystack,needle的下标,分别都从0开始匹配**(循环判断条件是不遇到空字符)**,匹配字符成功,继续匹配下一个即i++,j++;如果失败j为0,从needle起点开始,haystack从i-j+1开始。2原创 2020-08-31 23:51:06 · 89 阅读 · 0 评论 -
14. 最长公共前缀
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。题解思路:方法一:横向扫描用LCP(S1,S2,S3…Sn)表示字符串的最长公共前缀。可以得到以下结论:LCP(S1,S2,S3,…Sn)=LCP(LCP(LCP(S1,S2),S3),…Sn)1.基于该结论,可以得到一种查找字符串数组中的最长公共前缀的简单方法。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀原创 2020-08-12 22:05:36 · 164 阅读 · 0 评论 -
387. 字符串中的第一个唯一字符
题目:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。题目思路:方法1:hash数组该思路是基于桶排序思想。1.构造一个hash数组,对应26个字母,初值为0,每出现一次对应元素+12.遍历字符串(从前往后,因为返回字符串的第一个没有出现元素的下标),只出现次数为1的,返回数组下标。函数代码:class Solution {public: int firstUniqChar(string s) { int hash[26]={原创 2020-08-12 18:11:16 · 91 阅读 · 0 评论 -
20. 有效的括号
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。题解思路:栈是后进先出得数据结构,可以在栈顶进行弹出和插入,所以对于括号类题目用栈(stack)比较合适。下面举例说明三种情况不匹配:1)左括号多了((){}遍历完字符串,栈不为空,发现栈里面(存的是右括号)没有字符串相应的右括号相匹配,即有相应的左括号没有右括号来原创 2020-08-12 17:24:47 · 387 阅读 · 0 评论 -
125. 验证回文串
题目:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。函数Isalnumint isalnum(int c)功能:检查字符是否为字母数字1.检查c是十进制数字还是大写或小写字母。2.如果isalpha或isdigit也返回true,则结果为true。3.注意,什么是字母可能取决于所使用的语言环境。在默认的“ C”语言环境中,构成字母的是通过isupper或islower返回true的内容。4.有关标准ANSI原创 2020-08-12 00:46:04 · 629 阅读 · 0 评论 -
13. 罗马数字转整数
题目:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:I 可以放在原创 2020-08-12 00:22:10 · 109 阅读 · 0 评论