字符串

作者: 什锦甜 | 来源:发表于2018-06-25 15:51 被阅读8次

字符串

类型1:旋转字符串

无论是循环字符串还是整体反转,都要用到一个reverse函数来辅助实现。

类型2:字符串包含
  • leetcode 76. Minimum Window Substring
class Solution {
public:
    string minWindow(string s, string t) {
        if (s.size() == 0)
            return "";
        string res = s;
        string cur;
        unordered_map<char, int> s_count, t_count;
        for (int i = 0; i < t.size(); ++i)
            t_count[t[i]]++;
        int left = 0;
        for (int i = 0; i < s.size(); ++i) {
            s_count[s[i]]++;
            cur += s.substr(i,1);
            char lastLetter = '.';
            while(isCovered(s_count, t_count, lastLetter)) {
                res = res.size() > cur.size() ? cur : res;
                lastLetter = s[left];
                s_count[s[left++]]--;
                cur.erase(cur.begin());
            }
        }
        s_count.clear();
        for (int i = 0; i < res.size(); ++i)
            s_count[res[i]]++;
        if(isCovered(s_count, t_count, '.'))
            return  res;
        else
            return "";
    }
  • leetcode 3. Longest Substring Without Repeating Characters
    通常使用map和双指针来实现。
类型3:字符串转整数
  • leetcode 8. String to Integer (atoi)
    需要考虑很多边界情况,1)判断开头有没有空格;2)判断符号;3)判断有没有溢出;4)判断是不是数字
class Solution {
public:
    int myAtoi(string str) {
        int n = str.size();
        if( n == 0) return 0;
        while(str[0] == ' ') 
            str.erase(0,1);
        n = str.size();
        int flag = 1;
        if( str[0] == '+') 
        {
            str[0] = '0';
        }
        else if(str[0] == '-')
        {
            flag = -1;
            str[0] = '0';
        }
        int64_t sum = 0;
        for(int i = 0; i < n; i++)
        {
            if(str[i] >='0' && str[i] <= '9')
            {
                sum = sum*10 + (str[i]-'0');
                if(flag*sum > INT_MAX)
                    return INT_MAX;
                if(flag*sum < INT_MIN)
                    return INT_MIN;
            }
            else 
            { 
                break;
            }
        }
        return flag*sum;
    }
};
类型4:回文判断
  • 最长回文串 5. Longest Palindromic Substring
    思路1:动态规划
    dp[i][j]代表从ij的子串是否能够构成回文串
class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if(n == 0) return "";
        int dp[n][n] = {0}; // [i,j]
        int len = 1;
        int left = 0, right = 0;
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < i; j ++)
            {
                dp[j][i] = s[i] == s[j] && (i - j < 2 || dp[j+1][i-1]);
                if(dp[j][i] && len < i - j + 1 )
                {
                    len = i - j + 1;
                    left = j;
                    right = i;
                }
                
            }
            dp[i][i] = 1;
        }
        return s.substr(left,  len);
        
    }
};

思路2:枚举可能的回文串的中心,分奇偶情况。

class Solution {
public:
    string longestPalindrome(string s) {
        if (s.size() == 0)
            return "";
        string res;
        for (int i = 0; i < s.size(); ++i) {
            // i is center
            int left = i;
            int right = i;
            while (left >= 0 and right < s.size() and s[left] == s[right]) {
                res = res.size() < (right - left + 1) ? s.substr(left, right - left + 1) : res;
                --left;
                ++right;
            }
            // i and i+1 is center
            left = i;
            right = i + 1;
            while (left >= 0 and right < s.size() and s[left] == s[right]) {
                res = res.size() < (right - left + 1) ? s.substr(left, right - left + 1) : res;
                --left;
                ++right;
            }
        }
        return res;
    }
};

思路3:Manacher's Algorithm, 马拉车解法,可以把时间复杂度降到o(n)
讲解过程参考:https://blog.csdn.net/dyx404514/article/details/42061017

类型5: 字符串的全排列

用回溯法/迭代来实现

相关文章

  • Javascript知识点整合

    字符串 单行字符串: ‘字符串’或“字符串” 多行字符串: `多行字符串` 字符串操作: 字符串连接‘+’号 长度...

  • C++基础字符串

    字符串的构造 字符串特性描述 字符操作 字符串赋值 字符串连接 字符串比较 字符串查找 字符串替换 字符串删除 字...

  • iOS中的NSString与NSMutableString

    字符串的创建 字符串读写 字符串的比较 字符串的搜索 字符串截取 字符串替换 字符串与路径 字符串转换 NSMut...

  • iOS NSString用法总结

    字符串属性 字符串截取 字符串比较 字符串搜索 字符串拼接 字符串基本类型转换 字符串分行,分段 字符串列举(按条...

  • php 字符串常见方法汇总

    字符串拼接 字符串检索 字符串截取 字符串替换 字符串大小写转化 字符串转数组 字符串格式化

  • iOS 字符串截取、iOS 字符串替换、iOS 字符串分隔、iO

    iOS之字符串截取、iOS 字符串替换、iOS字符串分隔、iOS之字符串匹配、截取字符串、匹配字符串、分隔字符串 ...

  • PHP中字符串函数库常用函数解析 -- PHP 学习 (十一)

    常用字符串函数分类: 字符串长度, 字符串查找, 字符串大小写转换, 字符串截取, 字符串 ASCII, 字符串加...

  • Kotlin语言(二):字符串类型

    1、字符串定义 2、字符串删除空格 3、字符串比较 4、字符串切割 5、字符串截取 6、字符串替换 7、字符串模板

  • 字符串扩展

    求字符串大小 字符串解码、转换 字符串截取 字符串汉字处理 字符串 Mac地址 字符串进制转换

  • 2020-09-30字符串

    day8-字符串 字符串的操作 in 和 not in字符串1 in 字符串2 - 判断字符串1是否是字符串...

网友评论

      本文标题:字符串

      本文链接:https://www.haomeiwen.com/subject/ypisyftx.html