20 有效括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
class Solution {
public:
bool isValid(string s) {
if(s=="") return true;
stack<char> st;
for(auto i : s)
{
if(i=='{' || i=='[' || i=='(')
st.push(i);
else if(st.size()==0 && (i=='}'||i==']'|| i==')'))
return false;
else
if(i=='}'&&st.top()=='{' || i==']'&&st.top()=='[' || i==')'&&st.top()=='(')
st.pop();
else return false;
}
if(st.size()==0) return true;
else return false;
}
};
021 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* rst = new ListNode(0);
ListNode* head = rst;
while(l1!=NULL&&l2!=NULL)
{
if(l1->val>l2->val)
{
rst->next = l2;
l2=l2->next;
}
else
{
rst->next = l1;
l1 = l1->next;
}
rst=rst->next;
}
if(l1!=NULL)
rst->next=l1;
if(l2!=NULL)
rst->next=l2;
return head->next;
}
};
026 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;
int j = 1;
for(int i=1;i<nums.size();i++)
{
if(nums[i]!=nums[i-1])
{
nums[j++]=nums[i];
}
}
return j;
}
};
027 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if(nums.size()==0) return 0;
int j=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=val)
{
nums[j++]=nums[i];
}
}
return j;
}
};
028 实现strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:
输入: haystack = “aaaaa”, needle = “bba”
输出: -1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
class Solution {
public:
int strStr(string haystack, string needle) {
int n1 = haystack.length();
int n2 = needle.length();
if(n2==0) return 0;
for(int i=0;i<n1-n2+1;i++)
{
if(haystack.substr(i,n2) == needle)
{
return i;
}
}
return -1;
}
};