leetcode刷题——数据结构(5):字符串

字符串

1. 字符串循环移位包含※

 

 

2. 字符串循环移位

 

 

3. 字符串中单词的翻转

 

 

4. 两个字符串包含的字符是否完全相同

第一次可做出Ok

 

5. 计算一组字符集合可以组成的回文字符串的最大长度

解法可简化

6. 字符串同构

解法可简化

7. 回文子字符串个数(2.24)

技巧性解法

8. 判断一个整数是否是回文数

解法可简化

9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数

思考后可做出,

解法可优化

 

1. 字符串循环移位包含

s1 = AABCD, s2 = CDAA

Return : true

给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。

s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。

2. 字符串循环移位

s = "abcd123" k = 3
Return "123abcd"

将字符串向右循环移动 k 位。

将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321,然后对整个字符串进行翻转,得到 123abcd。

3. 字符串中单词的翻转

s = "I am a student"

Return "student a am I"

将每个单词翻转,然后将整个字符串翻转。

4. 两个字符串包含的字符是否完全相同

242. Valid Anagram (Easy)

https://leetcode-cn.com/problems/valid-anagram/

5. 计算一组字符集合可以组成的回文字符串的最大长度

409. Longest Palindrome (Easy)

https://leetcode-cn.com/problems/longest-palindrome/

class Solution {
public:
    int longestPalindrome(string s) {
        int hst[58],ret=0;
        memset(hst,0,sizeof(hst));
        for(char c:s) hst[c-'A']++;
        for(int i=0;i<58;i++)
            ret+=hst[i]/2*2;
        if(ret<s.size()) ret++;
        return ret;
    }
};

6. 字符串同构

205. Isomorphic Strings (Easy)

https://leetcode-cn.com/problems/isomorphic-strings/

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        if(s.size()!=t.size()) return false;
        int sot[128],tos[128];
        memset(sot,-1,sizeof(sot));
        memset(tos,-1,sizeof(tos));
        for(int i=0;i<s.size();i++){
            if(sot[s[i]]!=tos[t[i]]) return false;
            sot[s[i]]=i;
            tos[t[i]]=i;
        }
        return true;
    }
};

7. 回文子字符串个数

647. Palindromic Substrings (Medium)

https://leetcode-cn.com/problems/palindromic-substrings/

class Solution {
public:
    int countSubstrings(string s) {
        int ret=0;
        for(int i=0;i<s.size();i++){
            countP(s,i,i,ret);  //奇数对称
            countP(s,i,i+1,ret);  //偶数对称
        }
        return ret;
    }
    void countP(string s,int left,int right,int &cnt){
        while(left>=0&&right<s.size()&&s[left--]==s[right++])
            cnt++;
    }
};

8. 判断一个整数是否是回文数

9. Palindrome Number (Easy)

https://leetcode-cn.com/problems/palindrome-number/

class Solution {
public:
    bool isPalindrome(int x) {
        if(x==0) return true;
        else if(x<0||x%10==0) return false;
        int right=0;
        while(x>right){
            right=right*10+x%10;
            x/=10;
        }
        return x==right||x==right/10;        
    }
};

9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数

696. Count Binary Substrings (Easy)

https://leetcode-cn.com/problems/count-binary-substrings/

法一:
class Solution {
public:
    int countBinarySubstrings(string s) {
        int ret=0,pre=0,cur=1;
        for(int i=1;i<s.size();i++){
            if(s[i]==s[i-1]) cur++;
            else{
                pre=cur;
                cur=1;
            }
            if(pre>=cur) ret++;
        }
        return ret;
    }
};
法二:
class Solution {
public:
    int countBinarySubstrings(string s) {
        vector<int> dif;
        int ret=0;
        for(int i=1;i<s.size();i++)
            if(abs(s[i]-s[i-1])==1) dif.push_back(i);
        for(int i=0;i<dif.size();i++){
            int l=(i==0)?dif[i]:(dif[i]-dif[i-1]);
            int r=((i==dif.size()-1)?s.size():dif[i+1])-dif[i];
            ret+=min(l,r);
        }
        return ret;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值