Number of Ways to Split Into Primes - Company-specific OAs / Amazon OA

https://algo.monster/problems/amazon_oa_num_ways_to_split_into_primes

The test used in this challenge for Prime seems wrong,
e.g. test #4:
53739 has 3 ways:
{ ‘5,3,739’, ‘5,3739’, ‘53,739’ }
but the test says 2.

Java solution using DP:

import java.util.ArrayList;
import java.util.List;

public class SplitString {

public static int countSplitString(String s) {
	int[] dp = new int[s.length() + 1];
	for (int i = 0; i < dp.length; i++) {
		dp[i] = -1;
	}
	dp[s.length()] = 1;
	return countSplitString(s, 0, dp);
}

private static int countSplitString(String s, int start, int[] dp) {

	if (start == s.length()) {
		return 0;
	}

	int count = 0;
	for (int i = start; i < s.length() && i < start + 4; i++) {
		if (s.charAt(start) != '0') {
			String left = s.substring(start, i + 1);
			if (isPrime(left)) {
				if (dp[i + 1] > -1) {
					count += dp[i + 1];
				} else {
					count += countSplitString(s, i + 1, dp);
				}
			}
		}
	}
	dp[start] = count;
	return count;

}

private static boolean isPrime(String number) {
	int num = Integer.valueOf(number);

	for (int i = 2; i * i <= num; i++) {
		if ((num % i) == 0)
			return false;
	}
	return num > 1 ? true : false;
}

}

Shouldn’t the answer for Test Case #7 be 2? Pretty sure there are two possible partitions: [701, 3] and [7013]

Test case 4 is wrong as pointed by another person.
Test case 7 is also wrong. 7013 is a prime number and the tuple (701, 3) has both numbers also as prime i.e. the answer is 2 instead of 1.

‘5,3739’ has 3739 which is out of bounds.

“Each prime number, pn, must not contain leading 0s, and 2 <= pn <= 1000.”

“Each prime number, pn, must not contain leading 0s, and 2 <= pn <= 1000.”

7013 will violate the constraint.

The title says “Unique”, however, [3, 11, 7, 3] contains two 3.

2 <= pn <= 1000

Java solution using DFS and memoization approach:

import java.util.*;

class Solution {
public static int splitPrimes(String inputStr) {
Map<String, Integer> memo = new HashMap<>();
return helper(inputStr, 0, memo);
}

private static int helper(String inputStr, int start, Map<String, Integer> memo) {
    if (start == inputStr.length())
        return 1;
    
    int count = 0;
    for (int i = start; i < inputStr.length(); i++) {
        if(inputStr.charAt(start) != '0'){
            String str = inputStr.substring(start, i + 1);
            Integer value = Integer.parseInt(str);

            if (value > 1000)
                break;

            if (isPrime(value)) {
                if (memo.containsKey(inputStr.substring(i + 1))) {
                    count += memo.get(inputStr.substring(i + 1));
                } else {
                    count += helper(inputStr, i + 1, memo);
                }
            }
        }
    }
    memo.put(inputStr.substring(start), count);
    return count;
}

private static boolean isPrime(int num) {
    if (num <= 1)
        return false;
    if (num == 2 || num == 3)
        return true;
    if (num % 2 == 0)
        return false;
    
    for(int i = 3; i <= Math.sqrt(num); i += 2) {
        if (num % i == 0)
            return false;
    }
    return true;
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String inputStr = scanner.nextLine();
    scanner.close();
    int res = splitPrimes(inputStr);
    System.out.println(res);
}

}

Python version, using dfs + memo

import math

def split_primes(input_str: str) → int:
def is_prime(n):
if n == 1:
return False
if n ==2 or n == 3:
return True
if n%2 == 0: # even number must not be prime
return False
for i in range(3, int(math.sqrt(n))+1, 2):
if n%i == 0:
return False
return True
# using dfs + memo
def dfs(start_index, memo):
if start_index == len(input_str):
return 1
res = 0
for i in range(start_index, len(input_str)):
if input_str[start_index] != ‘0’:
next_sub_strs = input_str[start_index: i+1]
next_num = int(next_sub_strs)

            if next_num > 1000:
                break

            if is_prime(next_num):
                if input_str[i] in memo:
                    res += memo(input_str[i])
                else:
                    res += dfs(i+1, memo)
    memo[start_index] = res
    return res
    
ret = dfs(0, {})
return ret

What is the time complexity of the tabular vs top down DP approach?
I solved for all test cases building from brute force to bottom up DP, but am totally confused about the time complexity. Any leads here?
Here is my code : Playground - LeetCode