leetcode 87. Scramble String DFS深度优先搜索
来源:互联网 发布:Linux如何修改权限 编辑:程序博客网 时间:2024/06/04 18:22
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = “great”:
great
/ \
gr eat
/ \ / \
g r e at
/ \
a t
To scramble the string, we may choose any non-leaf node and swap its two children.
For example, if we choose the node “gr” and swap its two children, it produces a scrambled string “rgeat”.
rgeat
/ \
rg eat
/ \ / \
r g e at
/ \
a t
We say that “rgeat” is a scrambled string of “great”.
Similarly, if we continue to swap the children of nodes “eat” and “at”, it produces a scrambled string “rgtae”.
rgtae
/ \
rg tae
/ \ / \
r g ta e
/ \
t a
We say that “rgtae” is a scrambled string of “great”.
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
这道题题意很简单,但是我没有想到深度优先搜索可以这么做,我是网上参考的答案,这个解决方法很漂亮。
代码如下:
public class Solution { /* * 暴力求解,这个我就真的想不到了 * */ public boolean isScramble(String s1, String s2) { if(s1==s2 || s1.equals(s2)) return true; int []a=new int[26]; for(int i=0;i<s1.length();i++) a[s1.charAt(i)-'a']++; for(int i=0;i<s2.length();i++) a[s2.charAt(i)-'a']--; for(int i=0;i<a.length;i++) { if(a[i]!=0) return false; } //注意这里是 < for(int i=1;i<s1.length();i++) { if(isScramble(s1.substring(0,i), s2.substring(0,i)) && isScramble(s1.substring(i), s2.substring(i))) return true; if(isScramble(s1.substring(0,i), s2.substring(s2.length()-i)) && isScramble(s1.substring(i), s2.substring(0,s2.length()-i))) return true; } return false; }}
下面是C++的做法,就是使用DFS深度优先遍历暴力搜索,说实话,我自己想不出来,这是网上看的做法,很棒
代码如下:
#include <iostream>#include <string>#include <vector>using namespace std;class Solution {public: bool isScramble(string s1, string s2) { if (s1 == s2) return true; if (s1.length() != s2.length()) return false; vector<int> count(26,0); for (int i = 0; i < s1.length(); i++) count[(int)(s1[i] - 'a')]++; for (int i = 0; i < s2.length(); i++) count[(int)(s2[i] - 'a')]--; for (int i = 0; i < count.size(); i++) { if (count[i] != 0) return false; } for (int i = 1; i < s1.length(); i++) { if (isScramble(s1.substr(0,i), s2.substr(0,i)) && isScramble(s1.substr(i), s2.substr(i)) ) return true; if (isScramble(s1.substr(0,i), s2.substr(s2.length()-i)) && isScramble(s1.substr(i), s2.substr(0, s2.length()-i))) return true; } return false; }};
- leetcode 87. Scramble String DFS深度优先搜索
- LeetCode随笔之DFS深度优先搜索
- leetcode 78. Subsets DFS深度优先搜索
- leetcode:深度优先搜索(DFS)和广度优先搜索(BFS)
- 深度优先搜索 DFS
- 深度优先搜索 DFS
- DFS 深度优先搜索
- DFS 深度优先搜索
- 深度优先搜索(DFS)
- 深度优先搜索(DFS)
- 深度优先搜索DFS
- DFS深度优先搜索
- 深度优先搜索(DFS)
- dfs深度优先搜索
- dfs 深度优先搜索
- 深度优先搜索(DFS)
- 深度优先搜索DFS
- DFS深度优先搜索
- Java基础知识-网络编程
- 已知后序和中序求层序
- Node.js、express、mongodb 入门(基于easyui datagrid增删改查)
- ASP.NET Core Razor 视图组件
- 学习资料
- leetcode 87. Scramble String DFS深度优先搜索
- 解决php截取中英文不出现乱码
- C的|、||、&、&&、异或、~、!运算符
- js绑定事件、传递参数
- echarts-设置折线样式和X轴和Y轴的分割线样式
- Oracle获取一周前,一个月前,一年前的日期
- 发送和接收xml信息
- Date & Time组件(下)-CalendarView(日历视图)
- rocketMQ