/*动态规划 每一行 网格图的形式有两种 ABA ABC
既然用动态规划,就要考虑边界,和转移方程,我们通过dp[i][2]表示前i行一共两种形式,dp[i][0] 是ABA形式 dp[i][1]是ABC形式
边界:i=0 dp[0][0]=6 (ABA形式6种) ,dp[0][1] = 6(ABC形式6种) 不管怎么变,一共也就这12种形式
转移方程:dp[i][0]= 3*dp[i-1][0] + 2*dp[i-1][1] //通过前i-1层看第i层的ABA形式可以有几种 i>=1
dp[i][1]= 2*dp[i-1][0] + 3*dp[i-1][1] //通过前i-1层看第i层的ABC形式可以有几种 i>=1
时间复杂度O(n),空间复杂度O(n)
*/
class Solution {
public int numOfWays(int n) {
long[][] dp = new long[n][2];
long div = 1000000007;
dp[0][0] = 6;
dp[0][1] = 6;
for(int i=1; i<n ; i++){
dp[i][0] =(3*dp[i-1][0]+2*dp[i-1][1])%div;
dp[i][1] =(2*dp[i-1][0]+2*dp[i-1][1])%div;
}
return (int)((dp[n-1][0]+dp[n-1][1])%div);
}
}
// 时间复杂度O((n-m)*m) 空间复杂度O(1)
class Solution {
public int strStr(String haystack, String needle) {
if(needle == null)
return 0;
char[] h = haystack.toCharArray();
char[] n = needle.toCharArray();
for(int i=0 ; i<=h.length-n.length ; i++){
int a=i,b=0;
while(b<n.length && h[a]==n[b]){
a++;
b++;
}
if(b==n.length) return i;
}
return -1;
}
}