📌  相关文章
📜  一个字符串的子串,使得所有的最少人数是5功率

📅  最后修改于: 2021-04-29 02:33:54             🧑  作者: Mango

给定一个二进制字符串str 。任务是找到最小的正整数C ,以便可以将二进制字符串切成C个片段(子字符串),并且每个子字符串应为5的幂且没有前导零。

例子:

方法:这个问题是最长的增长子序列的简单变化。
i = 1进行迭代,对于j = 0j 每个str [j…i] ,我们检查str [j..i]形成的数字是否为5的幂,然后更新dp []数组具有尽可能低的裁切尺寸值的值。在确认由十进制的str [j..i]形成的数字是5的幂之后,我们计算dp [i] = min(dp [i],dp [j] + 1)
该技术与找到最长的增长子序列非常相似。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define ll unsigned long long
  
// Function that returns true
// if n is a power of 5
bool ispower(ll n)
{
    if (n < 125)
        return (n == 1 || n == 5 || n == 25);
    if (n % 125 != 0)
        return false;
    else
        return ispower(n / 125);
}
  
// Function to return the decimal
// value of binary equivalent
ll number(string s, int i, int j)
{
    ll ans = 0;
    for (int x = i; x < j; x++) {
        ans = ans * 2 + (s[x] - '0');
    }
    return ans;
}
  
// Function to return the minimum cuts required
int minCuts(string s, int n)
{
    int dp[n + 1];
  
    // Allocating memory for dp[] array
    memset(dp, n + 1, sizeof(dp));
    dp[0] = 0;
  
    // From length 1 to n
    for (int i = 1; i <= n; i++) {
  
        // If previous character is '0' then ignore
        // to avoid number with leading 0s.
        if (s[i - 1] == '0')
            continue;
        for (int j = 0; j < i; j++) {
  
            // Ignore s[j] = '0' starting numbers
            if (s[j] == '0')
                continue;
  
            // Number formed from s[j....i]
            ll num = number(s, j, i);
  
            // Check for power of 5
            if (!ispower(num))
                continue;
  
            // Assigning min value to get min cut possible
            dp[i] = min(dp[i], dp[j] + 1);
        }
    }
  
    // (n + 1) to check if all the strings are traversed
    // and no divisible by 5 is obtained like 000000
    return ((dp[n] < n + 1) ? dp[n] : -1);
}
  
// Driver code
int main()
{
    string s = "101101101";
    int n = s.length();
    cout << minCuts(s, n);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG
{
  
    // Function that returns true
    // if n is a power of 5
    static boolean ispower(long n)
    {
        if (n < 125)
        {
            return (n == 1 || n == 5 || n == 25);
        }
        if (n % 125 != 0)
        {
            return false;
        }
        else
        {
            return ispower(n / 125);
        }
    }
  
    // Function to return the decimal
    // value of binary equivalent
    static long number(String s, int i, int j) 
    {
        long ans = 0;
        for (int x = i; x < j; x++) 
        {
            ans = ans * 2 + (s.charAt(x) - '0');
        }
        return ans;
    }
  
    // Function to return the minimum cuts required
    static int minCuts(String s, int n)
    {
        int[] dp = new int[n + 1];
  
        // Alongocating memory for dp[] array
        Arrays.fill(dp, n+1);
        dp[0] = 0;
  
        // From length 1 to n
        for (int i = 1; i <= n; i++)
        {
  
            // If previous character is '0' then ignore
            // to avoid number with leading 0s.
            if (s.charAt(i - 1) == '0')
            {
                continue;
            }
            for (int j = 0; j < i; j++) 
            {
  
                // Ignore s[j] = '0' starting numbers
                if (s.charAt(j) == '0') 
                {
                    continue;
                }
  
                // Number formed from s[j....i]
                long num = number(s, j, i);
  
                // Check for power of 5
                if (!ispower(num)) 
                {
                    continue;
                }
  
                // Assigning min value to get min cut possible
                dp[i] = Math.min(dp[i], dp[j] + 1);
            }
        }
  
        // (n + 1) to check if all the Strings are traversed
        // and no divisible by 5 is obtained like 000000
        return ((dp[n] < n + 1) ? dp[n] : -1);
    }
  
    // Driver code
    public static void main(String[] args) 
    {
        String s = "101101101";
        int n = s.length();
        System.out.println(minCuts(s, n));
    }
}
  
// This code is contributed by 29AjayKumar


Python 3
# Python 3 implementation of the approach
   
# Function that returns true
# if n is a power of 5
def ispower( n):
    if (n < 125):
        return (n == 1 or n == 5 or n == 25)
    if (n % 125 != 0):
        return 0
    else:
        return ispower(n // 125)
  
   
# Function to return the decimal
# value of binary equivalent
def number(s, i, j):
    ans = 0
    for x in range( i, j) :
        ans = ans * 2 + (ord(s[x]) - ord('0'))
    return ans
  
# Function to return the minimum cuts required
def minCuts(s, n):
   
    # Allocating memory for dp[] array
    dp=[n+1 for i in range(n+1)]
    dp[0] = 0;
   
    # From length 1 to n
    for i in range(1, n+1) :
   
        # If previous character is '0' then ignore
        # to avoid number with leading 0s.
        if (s[i - 1] == '0'):
            continue
        for j in range(i) :
   
            # Ignore s[j] = '0' starting numbers
            if (s[j] == '0'):
                continue
   
            # Number formed from s[j....i]
            num = number(s, j, i)
   
            # Check for power of 5
            if (not ispower(num)):
                continue
   
            # Assigning min value to get min cut possible
            dp[i] = min(dp[i], dp[j] + 1)
   
    # (n + 1) to check if all the strings are traversed
    # and no divisible by 5 is obtained like 000000
    if dp[n] < n + 1:
        return dp[n] 
    else:
        return  -1
   
# Driver code
if __name__== "__main__":
    s = "101101101"
    n = len(s)
    print(minCuts(s, n))
  
# This code is contributed by ChitraNayal


C#
// C# implementation of the approach
using System;
  
class GFG
{
  
    // Function that returns true
    // if n is a power of 5
    static Boolean ispower(long n)
    {
        if (n < 125)
        {
            return (n == 1 || n == 5 || n == 25);
        }
        if (n % 125 != 0)
        {
            return false;
        }
        else
        {
            return ispower(n / 125);
        }
    }
  
    // Function to return the decimal
    // value of binary equivalent
    static long number(String s, int i, int j) 
    {
        long ans = 0;
        for (int x = i; x < j; x++) 
        {
            ans = ans * 2 + (s[x] - '0');
        }
        return ans;
    }
  
    // Function to return the minimum cuts required
    static int minCuts(String s, int n)
    {
        int[] dp = new int[n + 1];
  
        // Alongocating memory for dp[] array
        for (int i = 0; i <= n; i++)
            dp[i]=n+1;
        dp[0] = 0;
  
        // From length 1 to n
        for (int i = 1; i <= n; i++)
        {
  
            // If previous character is '0' then ignore
            // to avoid number with leading 0s.
            if (s[i - 1] == '0')
            {
                continue;
            }
            for (int j = 0; j < i; j++) 
            {
  
                // Ignore s[j] = '0' starting numbers
                if (s[j] == '0') 
                {
                    continue;
                }
  
                // Number formed from s[j....i]
                long num = number(s, j, i);
  
                // Check for power of 5
                if (!ispower(num)) 
                {
                    continue;
                }
  
                // Assigning min value to get min cut possible
                dp[i] = Math.Min(dp[i], dp[j] + 1);
            }
        }
  
        // (n + 1) to check if all the Strings are traversed
        // and no divisible by 5 is obtained like 000000
        return ((dp[n] < n + 1) ? dp[n] : -1);
    }
  
    // Driver code
    public static void Main(String[] args) 
    {
        String s = "101101101";
        int n = s.Length;
        Console.WriteLine(minCuts(s, n));
    }
}
  
/* This code contributed by PrinciRaj1992 */


PHP


输出:
3

时间复杂度: O(n 2 )
空间复杂度: O(n)