LeetCode C++刷题 5-8题题解

5、最长回文子串

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

题解:

动态规划

代码:

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        vector> dp(n, vector(n));
        string result;

        for(int l = 0; l < n; l ++){
            for(int i = 0; i + l < n; i ++){
                int j = i + l;
                if(l ==0){
                    dp[i][j] = 1;
                }
                else if(l == 1){
                    dp[i][j] = s[i] == s[j];
                }
                else{
                    dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
                }

                if(dp[i][j] && l + 1> result.size()){
                    result = s.substr(i, l + 1);
                }
            }
        }
        return result;
    }
};

6、Z字型变换

题目:

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);
示例 1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

遍历即可

代码:

class Solution
{
public:
	string convert(string s, int numRows) {
		if(numRows == 1){
            return s;
        }
        vector result(numRows);
		int entry = 1;
		int row = 0;
		int i = 0;
		while (i < s.size()) {
			result[row] += s[i];
			if (row > 0 && row < numRows - 1) {
				row += entry;
			}
			else if (row == 0) {
				entry = 1;
				row += entry;
			}
			else if (row == numRows - 1) {
				entry = -1;
				row += entry;
			}
			
			i += 1;
		}

		string r;
		for (int j = 0; j < result.size(); j++) {
			r += result[j];
		}
		return r;

	}
};

7、最长回文子串

题目:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

除10取余得反转的数

代码:

class Solution
{
public:
	int reverse(int x) {
		int result = 0;
		while (x != 0) {
			int pop = x % 10;
			x /= 10;
			if ((result > INT_MAX / 10) || (result == INT_MAX / 10
				&& pop == 7)) {
				return 0;
			}
			if ((result < INT_MIN / 10) || (result == INT_MIN / 10
				&& pop == 8)) {
				return 0;
			}
			result = result * 10 + pop;
		}
		return result;
	}
};

8、字符串转换整数(atoi)

题目:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0 。

提示:

本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 

示例 1:

输入: "42"
输出: 42
示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。
示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

        1.当乘和加超出有效范围时,可考虑使用除和减

        2.当超过int数据范围时,可使用long

代码:

#include
#include
using namespace std;
class Solution {
public:
	int myAtoi(string str) {
		long temp = 0;
		int i = 0;
		int n = str.size();
		int flag = 1;

		while (i < n && str[i] == ' ') {
			i++;
		}
		if (i < n && str[i] == '-') {
			flag = -1;
			i++;
		}
		else if (i < n && str[i] == '+') {
			i++;
		}
		if (i < n && (str[i] < '0' || str[i] > '9')) {
			return 0;
		}
		while (i < n && str[i] >= '0' && str[i] <= '9') {
			temp = temp * 10 + (str[i] - '0');
			if (temp > INT_MAX - 1) {
				break;
			}
            i += 1;
		}

		long result = temp * flag;
		if (result > INT_MAX) {
			return INT_MAX;
		}
		else if (result < INT_MIN) {
			return INT_MIN;
		}

		return result;
	}
};

 

你可能感兴趣的:(LeetCode,C++刷题)