1字符串

Posted LeoSirius

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1字符串相关的知识,希望对你有一定的参考价值。

  strStr
Problem Statement
For a given source string and a target string, you should output the first
index(from 0) of target string in source string.
If target does not exist in source, just return -1.

Example
If source = "source" and target = "target", return -1.
If source = "abcdabcdefg" and target = "bcd", return 1.

Challenge
O(n2) is acceptable. Can you implement an O(n) algorithm? (hint: KMP)

Clarification
Do I need to implement KMP Algorithm in a real interview?
Not necessary. When you meet this problem in a real interview, the interviewer may just want to test your basic implementation ability. But make sure your confirm with the interviewer first.

//C++
class Solution{
public:
    int strStr(string haystack, string needle){
        if(haystack.empty() && needle.empty()) return 0;
        if(haystack.empty()) return -1;
        if(needle.empty()) return 0;
        if(haystack.size() < needle.size()) return -1;
        
        for(int i = 0; i < haystack.size() - needle.size() + 1; i++){
            string::size_type j = 0;
            for(; j < needle.size(); j++){
                if(haystack[i+j] != needle[j]) break;
            }
            if(j == needle.size()) return i;
        }
        return -1;
    }
};

 


  Two Strings Are Anagrams
Write a method anagram(s,t) to decide if two strings are anagrams or not.

Example
Given s="abcd", t="dcab", return true.

Challenge
O(n) time, O(1) extra space

//题解1 - hashmap 统计字频
class Solution{
public:
    bool anagram(string s, string t){
        if(s.empty() || t.empty()){
            return false;
        }
        if(s.size() != t.size()){
            return false;
        }
        int letterCount[256] = {0};
        for(int i = 0; i != s.size(); i++){
            ++letterCount[s[i]];
            --letterCount[t[i]];
        }
        for(int i = 0; i != t.size(); i++){
            if(letterCount[t[i]] != 0){
                return false;
            }
        }
        return true;
    }
};
//题解2 - 排序字符串
class Solution{
public:
    bool anagram(string s, string t){
        if(s.empty() || t.empty()){
            return false;
        }
        if(s.size() != t.size()){
            return false;
        }
        sort(s.begin(), s.end());
        sort(t.begin(), t.end());
        if(s == t){
            return true;
        }else{
            return false;
        }
    }
};

 

 


  Compare Strings
Compare two strings A and B, determine whether A contains all of the characters in B.
The characters in string A and B are all Upper Case letters.

Example
For A = "ABCD", B = "ABC", return true.
For A = "ABCD" B = "AABC", return false.

//题目意思是问B中的所有字符是否都在A中,而不是单个字符。比如B="AABC"包含两个「A」,而A="ABCD"只包含一个「A」,故返回false. 做题时注意题意,必要时可向面试官确认。
class Solution{
public:
    bool compareStrings(string A, string B){
        if(A.size() < B.size()){
            return false;
        }
        const int AlphabetNum = 26;
        int letterCount[AlphabetNum] = {0};
        for(int i = 0; i != A.size(); ++i){
            ++letterCount[A[i] - A];
        }
        for(int i = 0; i != B.size(); i++){
            --letterCount[B[i] - A];
            if(letterCount[B[i] - A] < 0){
                return false;
            }
        }
        return true;
    }
};

 

 

  


  Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Example
Given ["lint", "intl", "inlt", "code"], return ["lint", "inlt", "intl"].
Given ["ab", "ba", "cd", "dc", "e"], return ["ab", "ba", "cd", "dc"].
Note
All inputs will be in lower-case

//题解1 - 双重for循环(TLE)
class Solution{
public:
    vector<string> anagrams(vector<string> &strs){
        if(strs.size() < 2){
            return strs;
        }
        vector<string> result;
        vector<bool> visited(strs.size(), false); 
        for(int s1 = 0; s1 != strs.size(); ++s1){
            bool has_anagrams = false;
            for(int s2 = s1 + 1; s2 < strs.size(); ++s2){
                if((!visited[s2]) && isAnagrams(strs[s1], strs[s2])){
                    result.push_back(strs[s2]);
                    visited[s2] = true;
                    has_anagrams = true;
                }
            }
            if((!visited[s1]) && has_anagrams) result.push_back(strs[s1]);
        }
        return result;
    }
private:
    bool isAnagrams(string &s, string &t){
        if(s.size() != t.size()){
            return false;
        }
        const int AlphabetNum = 26;
        int letterCount[AlphabetNum] = {0};
        for(int i = 0; i != s.size(); ++i){
            ++letterCount[s[i] - a];
            --letterCount[t[i] - a];
        }
        for(int i = 0; i != t.size(); i++){
            if(letterCount[t[i] - a] < 0){
                return false;
            }
        }
        return true;
    }
};
//题解2 - 排序 + hashmap
class Solition{
public:
    vector<string> anagrams(vector<string> &strs){
        unordered_map<string, int> hash;
        for(int i = 0; i < strs.size(); i++){
            string str = strs[i];
            sort(str.begin(), str.end());
            ++hash[str];
        }
        
        vector<string> result;
        for(int i = 0; i < strs.size(); i++){
            string str = strs[i];
            sort(str.begin(), str.end());
            if(hash[str] > 1){
                result.push_back(strs[i]);
            }
        }
        return result;
    }
};

 

 

 

  


  Longest Common Substring
Given two strings, find the longest common substring.
Return the length of it.
Example
Given A="ABCD", B="CBCE", return 2.
Note
The characters in substring should occur continuously in original string.
This is different with subsequence.

class Solution{
public:
    int longestCommonSubstring(string &A, string &B){
        if(A.empty() || B.empty()){
            return 0;
        }
        int lcs = 0, lcs_temp = 0;
        for(int i = 0; i < A.size(); ++i){
            for(int j = 0; j <B.size(); j++){
                lcs_temp = 0;
                while((i + lcs_temp < A.size()) && (j + lcs_temp < B.size()) && (A[i + lcs_temp] == B[j + lcs_temp])){
                    ++lcs_temp;
                }
                if(lcs_temp > lcs){
                    lcs = lcs_temp;
                }
            } 
        }
        return lcs;
    }
};

 


  Rotate String
Problem Statement
Given a string and an offset, rotate string by offset. (rotate from left to right)
Example
Given "abcdefg".
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"

 

class Solution{
public:
    string rotateString(string A, int offset){
        if(A.empty() || A.size() == 0){
            return A;
        }
        int len = A.size();
        offset %= len;
        reverse(A, 0, len - offset - 1);
        reverse(A, len - offset, len - 1);
        reverse(A, 0, len - 1);
        return A;
    }
private:
    void reverse(string &str, int start, int end){
        while(start < end){
            char temp = str[start];
            str[start] = str[end];
            str[end] = temp;
            start++;
            end--;
        }
    }
};

 

以上是关于1字符串的主要内容,如果未能解决你的问题,请参考以下文章

web代码片段

PHP 代码片段

JavaScript实用功能代码片段

JavaScript笔试题(js高级代码片段)

vs code 自定义代码片段

记录C#常用的代码片段