[questions chaudes leetcode 100] Enregistrement des questions (5-8)
5. La sous-chaîne palindrome la plus longue
Étant donné une chaîne s
, recherchez-la s
dans 最长的回文子串
.
Réponses aux questions
L'idée est une programmation dynamique.
Définition de l'état : dp[i][j]
Indique si la chaîne de i
à j
est une chaîne palindrome.Transfert
d'état :
s[i] == s[j]
divisé en deux types, un de longueur inférieure ou égale à 3 dp[i][j]==True
; dans les autres cas dp[i][j] = dp[i+1][j-1]
;
s[i] != s[j]
alors dp[i][j] = False
;
réponse python
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
# 初始化dp数组
dp = [[False]*(n) for _ in range(n)]
# 边界条件 单个字符是属于回文字符串的
for i in range(n): dp[i][i] = True
# 定义一下最长长度和初始位置
maxlen, idx = 1, 0
# 按照长度来遍历
for lens in range(2, n + 1):
for st in range(0, n - lens + 1):
end = st + lens - 1
if s[st] == s[end]: # 字符相等的时候,看长度, 分两种情况
if lens <= 3:
dp[st][end] = True
else:
dp[st][end] = dp[st+1][end-1]
else: # 字符不相等的时候,必然不是
dp[st][end] = False
# 更新一下最优状态
if dp[st][end] and lens > maxlen:
maxlen = lens
idx = st
return s[idx:idx+maxlen]
réponse du RPC
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < 2) {
return s;
}
int maxLen = 1;
int begin = 0;
vector<vector<bool>> dp(n, vector<bool>(n));
for (int i = 0; i < n; i ++) dp[i][i] = true;
for (int l = 2; l <= n; l ++)
{
for (int i = 0; i < n; i ++)
{
int j = i + l - 1;
if (j >= n) break;
if (s[i] == s[j])
{
if (l <= 3) dp[i][j] = true;
else dp[i][j] = dp[i+1][j-1];
}
else
{
dp[i][j] = false;
}
// 更新最优状态
if (dp[i][j] && l > maxLen)
{
maxLen = l;
begin = i;
}
}
}
return s.substr(begin, maxLen);
}
};
2. Ajoutez deux nombres
Vous recevez deux listes chaînées non vides, représentant deux entiers non négatifs. Chacun de leurs chiffres est stocké dans l'ordre inverse et chaque nœud ne peut stocker qu'un seul chiffre.
Veuillez ajouter deux nombres et renvoyer une liste chaînée représentant la somme sous la même forme.
Vous pouvez supposer qu’à l’exception du chiffre 0, aucun des deux nombres ne commencera par 0.
Réponses aux questions
Il suffit de le simuler directement. Lorsque vous utilisez C++, faites attention à savoir si l'objet renvoyé est un pointeur ou un objet. S'il s'agit d'un pointeur, utilisez-le à la place d'un ->
objet .
.
réponse python
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
adds = 0 # 进位
head = curr = ListNode(0)
while l1 or l2 or adds:
val = 0
if l1:
val += l1.val
l1 = l1.next
if l2:
val += l2.val
l2 = l2.next
val, adds = (val + adds) % 10, (val + adds) // 10
node = ListNode(val)
curr.next = node
curr = curr.next
return head.next
réponse du RPC
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int adds = 0;
ListNode *head = nullptr;
ListNode *curr = nullptr;
head = curr = new ListNode(0);
while (l1 || l2 || adds)
{
int val = 0;
if(l1)
{
val += l1->val;
l1 = l1->next;
}
if(l2)
{
val += l2->val;
l2 = l2->next;
}
curr->next = new ListNode((val + adds) % 10);
adds = (val + adds) / 10;
curr = curr->next;
}
return head->next;
}
};
3. La sous-chaîne la plus longue sans caractères répétés
Étant donné une chaîne s
, veuillez trouver 不含有重复字符
le .最长子串
长度
Réponses aux questions
Double pointeur plus ensemble
Faire glisser la fenêtre de gauche à droite. Si vous rencontrez set
un élément qui n'est pas là, le pointeur droit continue de se déplacer vers la droite jusqu'à ce qu'il ne soit plus satisfait. Mettez à jour la distance la plus longue, puis ajoutez s[r]
et supprimez s[l]
. Je l'ai également enregistré ici final_l
, ce qui équivaut à si la distance la plus longue est requise. Si la sous-séquence n'est pas répétée, sortez-la directement.s[final_l:final_l+res]
réponse python
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
l, r = 0, 0
final_l = 0
res = 0
dic = set()
while r < len(s):
while r < len(s) and s[r] not in dic:
dic.add(s[r])
r += 1
if r - l > res:
res = r - l
final_l = l
dic.remove(s[l])
l += 1
return res
réponse du RPC
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l = 0, r = 0, res = 0, final_l;
unordered_set<char> dic;
while (r < s.size())
{
while (r < s.size() and dic.find(s[r]) == dic.end())
{
dic.insert(s[r]);
r ++;
}
if (r - l > res)
{
res = r - l;
final_l = l;
}
dic.erase(s[l]);
l ++;
}
return res;
}
};
4. Trouvez la médiane de deux tableaux positifs
Étant donné deux tableaux ordonnés positivement (du petit au grand) et de tailles m
et respectivement . Veuillez trouver et renvoyer ces deux tableaux d'ordre positif .n
nums1
nums2
中位数
La complexité temporelle de l'algorithme devrait être de O(log (m+n))
.
Réponses aux questions
二分查找
Plus précisément, il s'agit de trouver une division de deux tableaux et de la transformer en un problème de recherche des k premiers petits nombres. Lors de la division, il s'agit principalement de faire en sorte que les valeurs des éléments à gauche et à droite de la ligne de démarcation satisfassent la relation d’ordre d’intersection, puis discutez de certaines conditions aux limites. Pour plus de détails, veuillez consulter l'analyse du site officiel
réponse python
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if len(nums1) > len(nums2):
return self.findMedianSortedArrays(nums2, nums1)
infinty = 2**40
m, n = len(nums1), len(nums2)
left, right = 0, m
# median1:前一部分的最大值
# median2:后一部分的最小值
median1, median2 = 0, 0
while left <= right:
# 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
# // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
i = (left + right) // 2
j = (m + n + 1) // 2 - i
# nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
nums_im1 = (-infinty if i == 0 else nums1[i - 1])
nums_i = (infinty if i == m else nums1[i])
nums_jm1 = (-infinty if j == 0 else nums2[j - 1])
nums_j = (infinty if j == n else nums2[j])
if nums_im1 <= nums_j:
median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)
left = i + 1
else:
right = i - 1
return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1
réponse du RPC
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {
return findMedianSortedArrays(nums2, nums1);
}
int m = nums1.size();
int n = nums2.size();
int left = 0, right = m;
// median1:前一部分的最大值
// median2:后一部分的最小值
int median1 = 0, median2 = 0;
while (left <= right) {
// 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
// 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
int i = (left + right) / 2;
int j = (m + n + 1) / 2 - i;
// nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
int nums_im1 = (i == 0 ? INT_MIN : nums1[i - 1]);
int nums_i = (i == m ? INT_MAX : nums1[i]);
int nums_jm1 = (j == 0 ? INT_MIN : nums2[j - 1]);
int nums_j = (j == n ? INT_MAX : nums2[j]);
if (nums_im1 <= nums_j) {
median1 = max(nums_im1, nums_jm1);
median2 = min(nums_i, nums_j);
left = i + 1;
} else {
right = i - 1;
}
}
return (m + n) % 2 == 0 ? (median1 + median2) / 2.0 : median1;
}
};