Find the largest prime number in String
Last Updated :
09 Nov, 2023
Given a string S, representing a large integer, the task is to return the largest-valued prime integer (as a string) that is a substring of the given string S.
Note: A substring is a contiguous sequence of characters within a string. A null string (“”) is also a substring.
Examples:
Input: S = �”
Output: ????”
Explanation: The only substring ????” is the largest prime number.
Input: S = �”
Output: �”
Explanation: The only substring �” is the largest prime number.
Input: S = �”
Output: �”
Explanation: The only substring �” is the largest prime number.
Input: S = �”
Output: “”
Explanation: There is no substring of a prime number.
Approach 1: (Bruteforce approach ) To solve the problem follow the below idea:
The idea is to check each and every substring by running two loops and checking whether the substring is prime or not and returning the largest prime number substring.
Below are the steps involved in the implementation of the code:
- Call the Function Find the largest prime by passing the string s as a parameter.
- Now iterate through each and every substring of the string and check whether it is prime or not.
- if is it prime check for the largest prime previous by taking an extra variable.
- Return the integer value of the largest substring in to_string format.
Below is the implementation for the above approach:
C++
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
bool is_prime( int n)
{
if (n <= 1)
return false ;
for ( int i = 2; i <= sqrt (n); i++) {
if (n % i == 0)
return false ;
}
return true ;
}
string find_largest_prime(string s)
{
int largest_prime = 0;
for ( int i = 0; i < s.length(); i++) {
for ( int j = i + 1; j <= s.length(); j++) {
string substring = s.substr(i, j - i);
if (substring.find_first_not_of( "0123456789" )
== string::npos
&& is_prime(stoi(substring))) {
largest_prime
= max(largest_prime, stoi(substring));
}
}
}
if (largest_prime < 0)
return " " ;
else
return to_string(largest_prime);
}
int main()
{
string s;
s = "132346" ;
string largest_prime = find_largest_prime(s);
cout << largest_prime << endl;
return 0;
}
|
Java
import java.util.*;
public class GFG {
static boolean isPrime( int n)
{
if (n <= 1 )
return false ;
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (n % i == 0 )
return false ;
}
return true ;
}
static String findLargestPrime(String s)
{
int largestPrime = 0 ;
for ( int i = 0 ; i < s.length(); i++) {
for ( int j = i + 1 ; j <= s.length(); j++) {
String substring = s.substring(i, j);
if (substring.matches( "[0-9]+" )
&& isPrime(
Integer.parseInt(substring))) {
largestPrime = Math.max(
largestPrime,
Integer.parseInt(substring));
}
}
}
if (largestPrime < 0 )
return " " ;
else
return String.valueOf(largestPrime);
}
public static void main(String[] args)
{
String s = "132346" ;
String largestPrime = findLargestPrime(s);
System.out.println(largestPrime);
}
}
|
Python3
import math
def is_prime(n):
if n < = 1 :
return False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if n % i = = 0 :
return False
return True
def find_largest_prime(s):
largest_prime = 0
for i in range ( len (s)):
for j in range (i + 1 , len (s) + 1 ):
substring = s[i:j]
if substring.isdigit() and is_prime( int (substring)):
largest_prime = max (largest_prime, int (substring))
if largest_prime < 0 :
return " "
else :
return str (largest_prime)
if __name__ = = "__main__" :
s = "132346"
largest_prime = find_largest_prime(s)
print (largest_prime)
|
C#
using System;
using System.Linq;
public class GFG {
static bool IsPrime( int n)
{
if (n <= 1)
return false ;
for ( int i = 2; i <= Math.Sqrt(n); i++) {
if (n % i == 0)
return false ;
}
return true ;
}
static string FindLargestPrime( string s)
{
int largestPrime = 0;
for ( int i = 0; i < s.Length; i++) {
for ( int j = i + 1; j <= s.Length; j++) {
string substring = s.Substring(i, j - i);
if (substring.All( char .IsDigit)
&& IsPrime( int .Parse(substring))) {
largestPrime = Math.Max(
largestPrime, int .Parse(substring));
}
}
}
if (largestPrime < 0)
return " " ;
else
return largestPrime.ToString();
}
public static void Main()
{
string s = "132346" ;
string largestPrime = FindLargestPrime(s);
Console.WriteLine(largestPrime);
}
}
|
Javascript
function isPrime(n) {
if (n <= 1) {
return false ;
}
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false ;
}
}
return true ;
}
function findLargestPrime(s) {
let largestPrime = 0;
for (let i = 0; i < s.length; i++) {
for (let j = i + 1; j <= s.length; j++) {
let substring = s.substring(i, j);
if (/^\d+$/.test(substring) && isPrime(parseInt(substring))) {
largestPrime = Math.max(largestPrime, parseInt(substring));
}
}
}
if (largestPrime < 0) {
return " " ;
} else {
return largestPrime.toString();
}
}
let s = "132346" ;
let largestPrime = findLargestPrime(s);
console.log(largestPrime);
|
Time Complexity: O(N^3)* O(log (N)), where N is the length of the string.
Auxiliary Space: O(1).
Approach 2: To solve the problem follow the below idea:
The idea is to genrate all prime numbers upto the maximum substring number present in string.
Below is the implementation for the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void genratePrimes( bool isPrime[], int n)
{
for ( int p = 2; p * p <= n; p++) {
if (isPrime[p] == true ) {
for ( int i = p * p; i <= n; i += p)
isPrime[i] = false ;
}
}
}
string find_largest_prime(string s, bool isPrime[])
{
int largest_prime = 0;
for ( int i = 0; i < s.length(); i++) {
int temp=0;
for ( int j = i; j < s.length(); j++) {
temp = temp * 10 + (s[j] - '0' );
if (isPrime[temp])
largest_prime = max(largest_prime, temp);
}
}
if (largest_prime < 0)
return " " ;
else
return to_string(largest_prime);
}
int main()
{
string s;
s = "132346" ;
int n = stoi(s);
bool isPrime[n + 1];
memset (isPrime, true , sizeof (isPrime));
genratePrimes(isPrime, n);
string largest_prime = find_largest_prime(s, isPrime);
cout << largest_prime << endl;
return 0;
}
|
Java
import java.util.Arrays;
public class GFG {
static void generatePrimes( boolean isPrime[], int n)
{
for ( int p = 2 ; p * p <= n; p++) {
if (isPrime[p]) {
for ( int i = p * p; i <= n; i += p)
isPrime[i] = false ;
}
}
}
static String findLargestPrime(String s,
boolean isPrime[])
{
int largestPrime = 0 ;
for ( int i = 0 ; i < s.length(); i++) {
int temp = 0 ;
for ( int j = i; j < s.length(); j++) {
temp = temp * 10 + (s.charAt(j) - '0' );
if (isPrime[temp])
largestPrime
= Math.max(largestPrime, temp);
}
}
if (largestPrime < 0 )
return " " ;
else
return Integer.toString(largestPrime);
}
public static void main(String[] args)
{
String s = "132346" ;
int n = Integer.parseInt(s);
boolean [] isPrime = new boolean [n + 1 ];
Arrays.fill(isPrime, true );
generatePrimes(isPrime, n);
String largestPrime = findLargestPrime(s, isPrime);
System.out.println(largestPrime);
}
}
|
Python3
def generate_primes(n):
is_prime = [ True ] * (n + 1 )
p = 2
while p * p < = n:
if is_prime[p]:
for i in range (p * p, n + 1 , p):
is_prime[i] = False
p + = 1
return is_prime
def find_largest_prime(s, is_prime):
largest_prime = 0
for i in range ( len (s)):
temp = 0
for j in range (i, len (s)):
temp = temp * 10 + int (s[j])
if is_prime[temp]:
largest_prime = max (largest_prime, temp)
if largest_prime < 0 :
return " "
else :
return str (largest_prime)
if __name__ = = "__main__" :
s = "132346"
n = int (s)
is_prime = generate_primes(n)
largest_prime = find_largest_prime(s, is_prime)
print (largest_prime)
|
C#
using System;
public class GFG {
static void genratePrimes( bool [] isPrime, int n)
{
for ( int p = 2; p * p <= n; p++) {
if (isPrime[p] == true ) {
for ( int i = p * p; i <= n; i += p) {
isPrime[i] = false ;
}
}
}
}
static string find_largest_prime( string s,
bool [] isPrime)
{
int largest_prime = 0;
for ( int i = 0; i < s.Length; i++) {
int temp = 0;
for ( int j = i; j < s.Length; j++) {
temp = temp * 10 + (s[j] - '0' );
if (isPrime[temp]) {
largest_prime
= Math.Max(largest_prime, temp);
}
}
}
if (largest_prime < 0) {
return " " ;
}
else {
return largest_prime.ToString();
}
}
static void Main()
{
string s;
s = "132346" ;
int n = int .Parse(s);
bool [] isPrime = new bool [n + 1];
for ( int i = 0; i <= n; i++) {
isPrime[i] = true ;
}
genratePrimes(isPrime, n);
string largest_prime
= find_largest_prime(s, isPrime);
Console.WriteLine(largest_prime);
}
}
|
Javascript
<script>
function generatePrimes(isPrime, n) {
for (let p = 2; p * p <= n; p++) {
if (isPrime[p] === true ) {
for (let i = p * p; i <= n; i += p) {
isPrime[i] = false ;
}
}
}
}
function findLargestPrime(s, isPrime) {
let largestPrime = 0;
for (let i = 0; i < s.length; i++) {
let temp = 0;
for (let j = i; j < s.length; j++) {
temp = temp * 10 + parseInt(s[j]);
if (isPrime[temp]) {
largestPrime = Math.max(largestPrime, temp);
}
}
}
if (largestPrime < 0) {
return " " ;
} else {
return largestPrime.toString();
}
}
let s = "132346" ;
let n = parseInt(s);
let isPrime = new Array(n + 1).fill( true );
generatePrimes(isPrime, n);
let largestPrime = findLargestPrime(s, isPrime);
document.write(largestPrime);
</script>
|
Time Complexity: O(N^2) + O(N*log(log(N))) ≈ O(N^2), N*log(log(N)) is used for generating all prime numbers to where N is the length of the string.
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...