17.电话号码的组合

在这里插入图片描述

  1. 我怎么也没想到,他还能打一样的。
    • 输入的数字的顺序能变,开始在dfs循环时,i总是从0开始;
    • 输入的数字的顺序不能变,开始在dfs循环时,i要从自己设定的一个变量p开始。比如输入2,3。当我们循环到 3 ,_时,由于不能从0开始循环,所以2填不进去。

当事人考虑到了2,写的错误代码:(主要思想还是填坑)

int flag_num[200]={0};
    int flag_char[200]={0};
    vector<string> letterCombinations(string digits) {
        vector<string> ans;
        if(digits.empty()) return ans;
        string tep;
         	string mapp[12];
            mapp[2]="abc";
            mapp[3]="def";
            mapp[4]="ghi";
            mapp[5]="jkl";
            mapp[6]="mno";
            mapp[7]="pqrs";
            mapp[8]="tuv";
            mapp[9]="wxyz";
        dfs(digits,ans,0,tep,mapp,0);
        return ans;
    }
    void dfs(string digits,vector<string>& ans,int n,string tep,string* mapp,int p){
        if(n>=digits.size()){
            ans.push_back(tep);
            return;
        }
        for(int i=p;i<digits.size();i++){
            if(flag_num[digits[i]-'0']==0){
                flag_num[digits[i]-'0']=1;
                 for(int j=0;j<mapp[digits[i]-'0'].size();j++){
                     if(flag_char[mapp[digits[i]-'0'][j]]==0){
                         flag_char[mapp[digits[i]-'0'][j]]=1;
                        tep.push_back(mapp[digits[i]-'0'][j]);
                        dfs(digits,ans,n+1,tep,mapp,p+1);
                        tep.pop_back();
                        flag_char[mapp[digits[i]-'0'][j]]=0;
                     }
                  }
                  flag_num[digits[i]-'0']=0;
            }   
        }
    }

这个题和之前自己想的有点不一样。
在这里插入图片描述
一个是有后效性(比如 n的全排列问题),一个没有(本题)。
从图上看,一个是分支不断减少,另一个是分支同等。
上面的是自己写出来的(所以程序也要模拟这个过程),下面的是客观存在的。
在这里插入图片描述
改变自己错误的代码,把一个循环换成了函数参数,同时把flag去掉了。
因为从图上看,这不就成了遍历一棵满n叉树了吗?遍历一棵树还需要标记走过了吗?

vector<string> letterCombinations(string digits)
{
	vector<string> ans;
	if(digits.empty()) return ans;
	string tep;
	string mapp[12];
	mapp[2]="abc";
	mapp[3]="def";
	mapp[4]="ghi";
	mapp[5]="jkl";
	mapp[6]="mno";
	mapp[7]="pqrs";
	mapp[8]="tuv";
	mapp[9]="wxyz";
	dfs(digits,ans,0,tep,mapp,0);
	return ans;
}
void dfs(string digits,vector<string>& ans,int n,string tep,string* mapp,int i)
{//这里i是第几个数字
	if(n>=digits.size())
	{
		ans.push_back(tep);
		return;
	}
	for(int j=0; j<mapp[digits[i]-'0'].size(); j++)//数字i里面有几个字母
	{
		tep.push_back(mapp[digits[i]-'0'][j]);
		dfs(digits,ans,n+1,tep,mapp,n+1);
		tep.pop_back();
	}
}
发布了161 篇原创文章 · 获赞 68 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43179428/article/details/105045108