这里写目录标题
题目
题目1
1. 递归函数里自带字符串,字符串长度不能过长。
两种不同的写法,第一种就TLE(time limited error),第二种才可以,不知道为啥,我推测和dfs的深度有关,如果深度在100以内我觉得都是可以用的,超过的话最好用第一种。因为第二种写法相当于当字符串长度为100之后,每次调用一次,都要重新构造一个字符串,相当于乘了100。
具体讲解:
str = str+"R";
str += "R";
这两种写法的时间复杂度是不一样的,如果str的长度为n,“R”的长度为1,那么第一种写法的时间为O(n),而第二种为O(1)
str =str+ "R"加的运算产生的是一个新的对象,再把结果返回,而str += “R” 涉及到的应该是对象的引用,操作之后直接返回引用,避免了产生新的对象。
class Solution {
string st_str,end_str;
bool flag1 = false,flag2 = false;
public:
string getDirections(TreeNode* root, int startValue, int destValue) {
dfs(root,startValue,destValue);
// cout<<st_str<<" "<<end_str;
int n = st_str.size(),i;
int n2 = end_str.size();
// cout<<n<<endl;
for(i = 0;i<n && i<n2;i++){
if(st_str[i] != end_str[i]){
break;
}
}
string ret(n-i,'U');
ret += end_str.substr(i);
return ret;
}
private:
string tmp;
void dfs(TreeNode* root,int val1,int val2){
if(root == nullptr) return;
if(flag1 && flag2) return;
if(root->val == val1){
flag1 = true;
st_str = tmp;
}else if(root->val == val2){
flag2 = true;
end_str = tmp;
}
tmp +='L';
dfs(root->left,val1,val2);
tmp.pop_back();
tmp+="R";
dfs(root->right,val1,val2);
tmp.pop_back();
}
};
第二种写法
class Solution {
string st_str,end_str;
bool flag1 = false,flag2 = false;
public:
string getDirections(TreeNode* root, int startValue, int destValue) {
dfs(root,startValue,destValue,"");
// cout<<st_str<<" "<<end_str;
int n = st_str.size();
int n2 = end_str.size();
// cout<<n<<endl;
int i = 0, j = 0;
while(st_str[i] == end_str[j]) i++,j++;
return string(st_str.size()-i,'U')+end_str.substr(j);
// for(i = 0;i<n && i<n2;i++){
// if(st_str[i] != end_str[i]){
// break;
// }
// }
string ret(n-i,'U');
ret += end_str.substr(i);
return ret;
}
private:
void dfs(TreeNode* root,int val1,int val2,string tmp){
if(flag1 && flag2) return;
if(root == nullptr){
return;
}else{
if(root->val == val1){
flag1 = true;
st_str = tmp;
}else if(root->val == val2){
flag2 = true;
end_str = tmp;
}
dfs(root->left,val1,val2,tmp+"L");
dfs(root->right,val1,val2,tmp+"R");
}
}
};