String - 5. 6.重写 14. 17. 20. 22. 38. 58. 71.

5Longest Palindromic Substring


Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

提示:start遍历string,left = right = start,记录以start为中心(如果有重复,start指向最左数)的回文字符串长度。

答案:

class Solution {
public:
    std::string longestPalindrome(std::string s) {
        if (s.size() < 2)
            return s;
        int len = s.size(), max_left = 0, max_len = 1, left, right;
        for (int start = 0; start < len && len - start > max_len / 2;) {
            left = right = start;
            while (right < len - 1 && s[right + 1] == s[right])
                ++right;
            start = right + 1;
            while (right < len - 1 && left > 0 && s[right + 1] == s[left - 1]) {
                ++right;
                --left;
            }
            if (max_len < right - left + 1) {
                max_left = left;
                max_len = right - left + 1;
            }
        }
        return s.substr(max_left, max_len);
    }
};

6ZigZag Conversion

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string s, int numRows);

Example 1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example 2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

P     I    N
A   L S  I G
Y A   H R
P     I

提示:找index规律,interval = 2 *(numRows - 1),第一行与最后一行相距interval,中间行相距在2与4x-6之间徘徊

答案:

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) {                                                                                         
            return s;                                                                                              
        }                                                                                                          
        std::string res;                                                                                      
        res.reserve(s.size());
        // print first row                                                                                         
        int interval = 2 * (numRows - 1);                                                                          
        for (int i = 0; i < s.length(); i += interval) {                                                           
            res += s[i];                                                                                           
        }                                                                                                          
        // print middle rows (conditionally)                                                                       
        for (int row = 1; row < numRows - 1; row ++) {                                                             
            for (int i = row, j = 0; i < s.length(); j += interval, i = j - i) {                                   
                res += s[i];                                                                                       
            }                                                                                                      
        }                                                                                                          
        // print last row (conditionally)                                                                          
        if (numRows > 1) {                                                                                         
            for (int i = numRows - 1; i < s.length(); i += interval) {                                             
                res += s[i];                                                                                       
            }                                                                                                      
        }                                                                                                          
        return res;             
    }
};
14Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

Example 1:

Input: ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

提示:拿出第一个字符串的第一个字符,与后面的每一个字符串比较,不同就返回。

答案:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (strs.empty()) {
            return "";
        }
        
        for (int i = 0; i < strs[0].size(); ++i) { // iterate through each character in base
            for (int j = 1; j < strs.size(); ++j) {
                if (strs[0][i] != strs[j][i]) {
                    return strs[0].substr(0, i);
                }
            }
        }
        return strs[0];
    }
};

17Letter Combinations of a Phone Number

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:

Although the above answer is in lexicographical order, your answer could be in any order you want.

提示:string数组代替map,temp临时保存上一循环res。注意res.clear()情况。

答案:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> res;
        string charmap[10] = {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        res.push_back("");
        for (int i = 0; i < digits.size(); i++)
        {
            vector<string> temp;
            string chars = charmap[digits[i] - '0'];
            for (int c = 0; c < chars.size();c++)
                for (int j = 0; j < res.size();j++)
                    temp.push_back(res[j]+chars[c]);
            res = temp;
        }
        if ((res.size()==1)&&(res[0] == "")) res.clear();
        return res;
    }
};

20Valid Parentheses

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

Example 1:

Input: "()"
Output: true

Example 4:

Input: "([)]"
Output: false

提示:使用stack,如果是左括号,入栈(把右括号入栈可以减少代码行),如果是右括号,比较后出栈

答案:

class Solution {
public:
    bool isValid(string s) {
        //empty
        stack<char> stk;
        for(char c : s){
            if (c == '(')
	        stk.push(')');
            else if (c == '{')
                stk.push('}');
            else if (c == '[')
                stk.push(']');
            else if (stk.empty() || stk.top() != c)
                return false;
            else stk.pop();
        }
        return stk.empty();
    }
};

22Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

提示:递归,使用left = right = n,分别保存左、右括号剩余个数。

答案:

class Solution {
private:  
    void helper(vector<string> & res, string str, int left, int right){
        if(left == 0 && right == 0){
            res.push_back(str);
            return;
        }
        if(left > 0) helper(res, str + "(", left - 1, right);
        if(right > left) helper(res, str + ")", left, right - 1);
    }
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ret;
        helper(ret, "", n, n);
        return ret;
    }

};

38Count and Say

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

Given an integer n, generate the nth term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.

From the examples you can see, the (i+1)th sequence is the "count and say" of the ith sequence!

 1.     1
 2.     11
 3.     21
 4.     1211
 5.     111221 
 6.     312211
 7.     13112221
 8.     1113213211
 9.     31131211131221
 10.   13211311123113112211

From the examples you can see, the (i+1)th sequence is the "count and say" of the ith sequence!

提示:迭代或者递归。主要为for语句遍历res,cout计数,while语句遍历重复数。

答案:

class Solution {
public:
   string countAndSay(int n) {
        if (n == 0) return "";
        string res = "1";
        while (--n) {
            string cur = "";
            for (int i = 0; i < res.size(); i++) {
                int count = 1;
                 while ((i + 1 < res.size()) && (res[i] == res[i + 1])){
                    count++;    
                    i++;
                }
                cur += to_string(count) + res[i];
            }
            res = cur;
        }
        return res;
    }
};
string countAndSay(int n) {
    if (n == 1){return "1";}
    if (n == 2){return "11";}
    string result = countAndSay(n-1);
    string newresult = "";
    int count = 1;
    for(int i = 1; i < result.size(); ++i){
        if(result[i]!=result[i-1]){
            newresult.push_back('0'+count);
            newresult.push_back(result[i-1]);
            count = 1;
        }else{
            count++;
        }
        if(i == result.size()-1){
            newresult.push_back('0'+count);
            newresult.push_back(result[i]);
        }
    }
    return newresult;
}

58Length of Last Word

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string.

If the last word does not exist, return 0.

Note: A word is defined as a character sequence consists of non-space characters only.

Example:

Input: "Hello World"
Output: 5

提示:第一个while语句找到非‘ ’字符,第二个while语句计数

答案:

class Solution {
public:
    int lengthOfLastWord(string s) { 
        int len = 0, tail = s.length() - 1;
        while (tail >= 0 && s[tail] == ' ') tail--;
        while (tail >= 0 && s[tail] != ' ') {
            len++;
            tail--;
        }
        return len;
    }
};

71Simplify Path

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"

path = "/a/./b/../../c/", => "/c"

path = “/a/./b/../c/”, => “/a/c”

path = “/a/./b/c/”, => “/a/b/c”

Corner Cases:

  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".

提示:1、如果是空或者“.”,那么当前没有什么地址变动,地址栈不需要变动 
            2、如果是“..” 则需要出栈(如果栈为空则不操作)因为这是返回上级目录的符号 

             3、其他情况压栈

getline()的原型是istream& getline ( istream &is , string &str , char delim );
其中 istream &is 表示一个输入流,譬如cin;
string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)。

答案:

class Solution {
public:
   string simplifyPath(string path) {
        string res, tmp;
        if(path.empty()) return res;
        vector<string> stk;
        stringstream ss(path);
        while(getline(ss,tmp,'/')) {
            if (tmp == "" or tmp == ".") continue;
            if(tmp != "..") stk.push_back(tmp);
            else if(!stk.empty()) stk.pop_back();
        }
        for(auto str : stk) res += "/"+str;
        return res.empty() ? "/" : res;
    }
};



猜你喜欢

转载自blog.csdn.net/qq_27012963/article/details/80366672
今日推荐