LeetCode刷题191218
好多天没有更新了,今天有空,刷一道。
算法第5题
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
这道题有多种解法,用了这位网友关于动态规划的思路完成的,传送门。
1 public class Solution 2 { 3 public string LongestPalindrome(string s) 4 { 5 var length = s.Length; 6 7 if (length <= 1) 8 { 9 return s; 10 } 11 12 bool[,] status = new bool[length, length]; 13 14 var strArray = s.ToCharArray(); 15 var palindromeLength = 1; 16 var palindrmoeStr = strArray.First().ToString(); 17 18 for (int r = 1; r < length; r++) 19 { 20 for (int l = 0; l < r; l++) 21 { 22 if (strArray[l] == strArray[r] && (r - l <= 2 || status[l + 1, r - 1])) 23 { 24 status[l, r] = true; 25 26 if (r - l + 1 > palindromeLength) 27 { 28 palindromeLength = r - l + 1; 29 palindrmoeStr = s.Substring(l, palindromeLength); 30 } 31 } 32 } 33 } 34 35 return palindrmoeStr; 36 } 37 }
这道题的关键点在于如何判断一个字符串是不是“回文”。所谓“回文”,就是说这个字符串正序和逆序的结果是相同的。因此,如果这个字符串是回文,那么它的首字母和尾字母是相同的。并且对于一个“回文”的字符串来说,如果我们拿掉了首字母和尾字母,剩下的部分应该依然是回文。
因此我们可以这么来判断一个字符串是不是“回文”,如果它的首尾字母相同,我们就去掉这个字符串的首尾字符,(否则说明这个字符串满足条件)最终会得到长度为2,或3的子字符串。此时如果首尾依旧相同,那么我们就可以说这个字符串是满足条件的了。也就是说我们可以利用子的字符串是不是“回文”,来判断父字符串是不是回文了。
另,顺手把第九题也做了。
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
1 public class Solution { 2 public bool IsPalindrome(int x) 3 { 4 var str = x.ToString(); 5 var length = str.Length; 6 7 if (length <= 1) 8 { 9 return true; 10 } 11 12 var result = true; 13 14 var array = str.ToCharArray(); 15 16 for (int i = 0; i < length / 2 + 1; i++) 17 { 18 if (array[i] != array[length - 1 - i]) 19 { 20 result = false; 21 break; 22 } 23 } 24 25 return result; 26 } 27 }