17. 电话号码的字母组合
题目地址:力扣17
思路:
分析一下题目,很好掌握规律。比如2 3对应的字符串分别是“abc","def",于是一对多对应下来就是ad ae af bd be bf cd ce cf.
因为前后都是有顺序的,并且第一个的第一个字母对应第二个全部执行完,再执行第一个的第二个字母,这时候我们就可以想到用递归来解决。
递归思路:遍历第一个字符串,每加入一个字母后开始递归下一个字符串,递归完后弹出这个字母。 递归终止条件:当遍历到了最后一个字符串,就把生成的字符串加入到动态数组中,并结束该轮递归。
看代码应该很容易看懂()
代码:
class Solution {
public:
vector<string> ans;
vector<string> letterCombinations(string digits) {
if(digits=="")return ans;
string a[11]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string t="";
dfs(a,digits,0,ans,t);
return ans;
}
void dfs(string a[],string d,int i,vector<string> &ans,string t)
{
if(i==d.length()){
ans.push_back(t);
return ;
}
int g=int(d[i]-'0');
string c=a[g];
for(int j=0;j<c.length();j++)
{
t.push_back(c[j]);
dfs(a,d,i+1,ans,t);
t.pop_back();
}
}
};
19.删除链表的倒数第 n 个结点
题目地址:力扣19
思路:
经典考研题。
用t和p两个指针,t走到n后p再往后走,这样等到t走完的时候,p就是倒数第n个点了。
删除的话就直接看代码吧。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p=head;
ListNode* t=head;
n++;
while(n&&t)
{
t=t->next;
n--;
}
if(n==1){
return head->next;
}
else if(n>1)return head;
while(t)
{
p=p->next;
t=t->next;
}
if(p->next&&p->next->next){
p->next=p->next->next;
}
else{
p->next=nullptr;
}
return head;
}
};
20. 有效的括号
题目地址:力扣20
思路:
栈的入门题。
代码:
class Solution {
public:
bool isValid(string s) {
stack<char> a;
for(int i=0;i<s.length();i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')a.push(s[i]);
if(s[i]==')'){
if(!a.size()||a.top()!='(')return false;
else a.pop();
}
else if(s[i]==']')
{
if(!a.size()||a.top()!='[')return false;
else a.pop();
}
else if(s[i]=='}'){
if(!a.size()||a.top()!='{')return false;
else a.pop();
}
}
if(a.size()>0)return false;
return true;
}
};