面试代码基础(一)从strstr说起

对于写程序要注意:要能在面试官的提示下把代码写出来(把思想实现的能力)!还要注意边界检查!递归找到出口!

开场来个简单字符串匹配

int strstr(char* target,char* source){
	if(target==NULL||source == NULL){
		return -1;
	}
	int i=0,j=0;
	for(int i=0;i<strlen(source)-strlen(target)+1;i++){
		for(int j=0; j<strlen(target); j++){
			if(source[i] != target[j]){
				break;
			}
			
		}
		if(j=strlen(target)){
			return i;
		}
	}
	return -1;
	
}

  一:排列&&组合模板

subsets 求所有的子集

{1,2,3}

[

[],//别忘了空

[1],

[2],

[3],

[1,2],

[1,3],

[2,3],

[1,2,3],

]

  

在这里采用深度优先的思想

注意去除重复的:利用pos标记

1.思想:思考递归,是一个树的结构,把1开头的找出来,把2开头的,把3开头的,递归你add了什么事情,递归回来要pop掉

把list的所有子集放在rst里。记得放入空。

vector<int> &subsets(vector<int> &rst,vector<int>& num,vector<int>& list,int pos){
	
	rst.push_back(list);
	for(int i=pos;i<num.size();i++){
		list.push_back(num[i]);
		subsets(rst,num,list,i+1);
		list.pop_back();
	}

}

2.扩展:带重复元素的子集,那么[1,2(2)]和[1,2(3)]就会产生重复

笨想法:在加入rst里查找是否包含!!

这样会浪费时间,有没有更方便快速的

要取相同的数必须连续的取,不允许跳过取,那么先要进行排序

a.对num排序!!!

b.跳过同样的数,这dfgui种情况不合法就跳过continue;

sort(num.begin(),num.end());
vector<int> &subsets(vector<int> &rst,vector<int>& num,vector<int>& list,int pos){
	
	rst.push_back(list);
	for(int i=pos;i<num.size();i++){
		if(i != pos && num[i-1] == num[i]){
			continue;
		}
		list.push_back(num[i]);
		subsets(rst,num,list,i+1);
		list.pop_back();
	}

}

  pos [1,2,2]

[1]

pos=1;//下标是1

i=pos=1;

跳过pos往后取。

应该从pos这里开始往后取(包括pos)

但是pos没取 取pos后面的

发现i与i-1取值相同,跳过i

if(pos!=i && num[i] == num[i-1])

3.求回文分割

aab

思想 :假设aa之间有一个数#,ab之间有一个数&

那么4种情况,

取 #

取 &

取 #&

都不取!!!!!

相当于求两个数的所有子集

思考下代码怎么写?

原文地址:https://www.cnblogs.com/ldphoebe/p/5937729.html