leetcode-841-钥匙和房间 题型:深优、递归 难度:中等 题目:有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。 在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。 最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返回 true,否则返回 false。 代码:
class Solution {
private :
int count;
public :
void dfs ( vector< vector< int >> & rooms, vector< bool > & vec, int n) {
vec[ n] = true ;
count++ ;
for ( auto i: rooms[ n] )
{
if ( vec[ i] == false )
{
dfs ( rooms, vec, i) ;
}
}
}
bool canVisitAllRooms ( vector< vector< int >> & rooms) {
int len = rooms. size ( ) ;
vector< bool > vec ( len, false ) ;
vec[ 0 ] = true ;
dfs ( rooms, vec, 0 ) ;
if ( count == len)
return true ;
return false ;
}
} ;
leetcode-557-反转字符串中的单词3 题型:字符串 难度:简单 题目:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 代码:
class Solution {
public :
string reverseWords ( string s) {
string resstr = "" ;
string curstr = "" ;
for ( int i= s. size ( ) - 1 ; i>= 0 ; i-- )
{
if ( s[ i] != ' ' )
{
curstr + = s[ i] ;
}
else
{
curstr = " " + curstr;
resstr = curstr+ resstr;
curstr = "" ;
}
}
if ( curstr != "" )
resstr = curstr+ resstr;
return resstr;
}
} ;
leetcode-474-一和零 题型:动态规划、01背包 难度:中等 题目:在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。 你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。 代码:
class Solution {
public :
int findMaxForm ( vector< string> & strs, int m, int n) {
int nlen = strs. size ( ) ;
vector< vector< int > > vec ( m+ 1 , vector< int > ( n+ 1 , 0 ) ) ;
for ( int i= 0 ; i< nlen; i++ )
{
int num0 = 0 ;
int num1 = 0 ;
int strlen1 = strs[ i] . size ( ) ;
for ( int j= 0 ; j< strlen1; j++ )
{
if ( strs[ i] [ j] == '0' )
num0++ ;
if ( strs[ i] [ j] == '1' )
num1++ ;
}
for ( int a= m; a>= num0; a-- )
{
for ( int b= n; b>= num1; b-- )
{
vec[ a] [ b] = max ( vec[ a] [ b] , vec[ a- num0] [ b- num1] + 1 ) ;
}
}
}
return vec[ m] [ n] ;
}
} ;