2496. Maximum Value of a String in an Array


Problem Description

The problem provides us with an array strs of alphanumeric strings, where an alphanumeric string is one that contains letters and/or numbers. The task is to determine the maximum value of any string in the array, with the 'value' being calculated differently based on the content of the string:

  • If the string contains only digits, its value is the numeric value of the string when interpreted as a base 10 integer. For example, the string "123" has a value of 123.
  • If the string contains any letters (thus it's not comprised of digits only), its value is the length of the string. For instance, the string "abc123" has a value of 6, since it contains three letters and three digits.

The goal is to iterate through each string in the array strs, calculate its value according to these rules, and return the highest value found.

Intuition

The intuition behind the solution is to iterate through each string in the array and apply the rules given to calculate the value for each string:

  1. Define a function f(s) that takes a string s as input and returns:
    • The integer value of the string if the string is made up only of digits - we can use Python's built-in int() function for the conversion process.
    • The length of the string if it contains any non-digit characters - this can be done simply by using Python's len() function.
  2. Then, use the built-in max() function to find the maximum value among all strings in the array. In Python, we can use a generator expression (f(s) for s in strs) to apply the function f to each string s in strs and find the maximum value.

The all(c.isdigit() for c in s) checks whether all characters c in string s are digits, which is needed to determine whether to interpret the string as a number or to use its length as the value.

By breaking down the problem into smaller parts and using Python's expressive features, we arrive at a concise and efficient solution.

Not Sure What to Study? Take the 2-min Quiz to Find Your Missing Piece:

How does merge sort divide the problem into subproblems?

Solution Approach

The solution's approach involves a single-pass algorithm leveraging basic list comprehension and utility functions in Python. Here's how it's implemented:

  • The Solution class contains a method maximumValue, which is designed to process a list strs of alphanumeric strings and return the maximum calculated value among them.

  • Within this method, we define an inner function f(s) that represents the rule-based evaluation of each string's value. It accepts a single string s as a parameter.

  • The f(s) function uses a conditional expression using the generator expression all(c.isdigit() for c in s). This evaluates to True if every character c in the string s is a digit (a numerical character between '0' and '9'), which Python's str.isdigit() method can check individually.

  • If the string s consists solely of digits, f(s) converts it to an integer using int(s) and returns this integer value.

  • If the string contains any non-digit characters, the else condition is triggered, and the length of the string is returned using len(s).

  • The main part of the maximumValue method consists of the max() function, which is a built-in Python function that finds the maximum item in an iterable. The iterable, in this case, is a generator expression that applies the f(s) function to every string s in the list strs.

  • Each string is passed to the f(s) function, which calculates its value based on the rules provided. The max() function then compares these values, and the highest value is determined and returned as the result of the maximumValue method.

By using a helper function and a generator expression within the max() function, the solution elegantly handles the calculation of each string's value according to its characteristics (being a pure number or containing letters) and efficiently finds the maximum of these values.

Discover Your Strengths and Weaknesses: Take Our 2-Minute Quiz to Tailor Your Study Plan:

The three-steps of Depth First Search are:

  1. Identify states;
  2. Draw the state-space tree;
  3. DFS on the state-space tree.

Example Walkthrough

Let's consider the array strs contains the following alphanumeric strings:

1["10", "abc", "456", "12345", "xyz89"]

Using the solution approach, let's iterate through each string and calculate its value:

  1. The string "10" contains only digits, so according to the rules, its value is the numeric value of the string. Therefore, f("10") returns int("10") which is 10.

  2. The string "abc" contains letters, and so its value is the length of the string. Hence, f("abc") returns len("abc") which is 3.

  3. Similarly, "456" is also comprised of only digits, so f("456") evaluates to int("456"), giving the value 456.

  4. "12345" is another string of only digits, so its value is f("12345") which equals int("12345"), that is 12345.

  5. Lastly, the string "xyz89" contains letters as well as digits, so we only look at the length of the string. The value will be f("xyz89") which equals len("xyz89"), resulting in 5.

Now we find the maximum value among all computed values. This is done by applying the max() function to the generator expression which evaluates f(s) for each string s in strs:

1max_values = [f(s) for s in strs] # This will be [10, 3, 456, 12345, 5]
2max_value = max(max_values) # This finds the max which is 12345
3
4return max_value # The function returns 12345

So, the highest value found in the array strs is 12345, which will be the output of the function maximumValue.

Solution Implementation

1from typing import List
2
3class Solution:
4    def maximumValue(self, strs: List[str]) -> int:
5        # This helper function calculates the value of a given string.
6        def calculate_value(string: str) -> int:
7            # If the string contains only digits, convert it to an integer.
8            if all(char.isdigit() for char in string):
9                return int(string)
10            # Otherwise, return the length of the string.
11            else:
12                return len(string)
13
14        # Calculate the values of all strings using the helper function
15        # and return the maximum value found.
16        return max(calculate_value(s) for s in strs)
17
1class Solution {
2    // Method to find the maximum value among all strings in the array
3    public int maximumValue(String[] strings) {
4        int ans = 0; // Initialize the answer to 0
5        // Iterate through each string in the array
6        for (String str : strings) {
7            // Update the answer with the maximum value between the current answer and the value returned by function f
8            ans = Math.max(ans, f(str));
9        }
10        return ans; // Return the maximum value found
11    }
12
13    // Helper function to calculate the value of a string based on given conditions
14    private int f(String str) {
15        int value = 0; // Initialize integer to store numeric value of the string
16        // Iterate over each character in the string
17        for (int i = 0, len = str.length(); i < len; ++i) {
18            char ch = str.charAt(i); // Get the character at the current index
19            // If the character is a letter, immediately return the length of the string as the value
20            if (Character.isLetter(ch)) {
21                return len;
22            }
23            // If the character is not a letter, accumulate its numeric value
24            value = value * 10 + (ch - '0');
25        }
26        return value; // Return the numeric value of the string
27    }
28}
29
1#include <vector>    // Required for vector
2#include <string>    // Required for string
3#include <algorithm> // Required for std::max function
4
5class Solution {
6public:
7    // Function to find the maximum value from a vector of strings
8    int maximumValue(vector<string>& strs) {
9        // Lambda function to calculate the numeric value of the string or
10        // return the string size if it contains a non-digit character
11        auto calculateValue = [](const string& str) {
12            int numericValue = 0; // Initialize the numeric value to 0
13            // Iterate through each character in the string
14            for (const char& c : str) {
15                // If the character is not a digit, return the size of the string
16                if (!isdigit(c)) {
17                    return static_cast<int>(str.size());
18                }
19                // Combine the previous value and the current digit to form the numeric value
20                numericValue = numericValue * 10 + c - '0';
21            }
22            // Return the formed numeric value
23            return numericValue;
24        };
25
26        int maxValue = 0; // Initialize the maximum value to 0
27        // Iterate through each string in the input vector
28        for (const auto& s : strs) {
29            // Update maxValue with the greater value between itself and
30            // the numeric value calculated for the current string
31            maxValue = std::max(maxValue, calculateValue(s));
32        }
33        // Return the maximum value found
34        return maxValue;
35    }
36};
37
1/**
2 * Calculates the maximum value from an array of strings where each string
3 * is either a number represented as a string or a non-numeric string.
4 * 
5 * @param {string[]} strings - An array of strings containing numbers or text.
6 * @return {number} The maximum value found in the array.
7 */
8function maximumValue(strings: string[]): number {
9    /**
10     * Helper function that converts a string to a number if it is numeric,
11     * otherwise returns the length of the string.
12     *
13     * @param {string} str - The input string to convert.
14     * @return {number} The numeric value of the string or its length.
15     */
16    const convertStringToValue = (str: string): number => {
17        // Check if the string is a valid number and convert, otherwise return its length
18        return Number.isNaN(Number(str)) ? str.length : Number(str);
19    };
20
21    // Map each string to its numeric value and return the maximum from the resulting array
22    return Math.max(...strings.map(convertStringToValue));
23}
24
Not Sure What to Study? Take the 2-min Quiz:

What is the worst case running time for finding an element in a binary tree (not necessarily binary search tree) of size n?

Time and Space Complexity

Time Complexity

The time complexity of the code is O(n*k), where n is the number of strings in the input list strs, and k is the average length of the strings.

The f function consists of a comprehension all(c.isdigit() for c in s) that iterates over each character c in the string s, resulting in O(k) where k is the length of the string s. The f function is called once for each string in strs, leading to n calls in total.

Therefore, iterating over all n strings and checking each character for being a digit or not takes O(n*k) time.

Space Complexity

The space complexity of the code is O(1).

The f function uses a comprehension that checks if each character is a digit, but it does not use any additional space that scales with the input size. The storage for temporary variables like the value of int(s) or len(s) does not depend on the size of the input list.

Since there is no dynamic data structure used that grows with the input, the space complexity remains constant, regardless of the size of strs.

Learn more about how to find time and space complexity quickly using problem constraints.

Fast Track Your Learning with Our Quick Skills Quiz:

Which algorithm is best for finding the shortest distance between two points in an unweighted graph?


Recommended Readings


Got a question? Ask the Teaching Assistant anything you don't understand.

Still not clear? Ask in the Forum,  Discord or Submit the part you don't understand to our editors.


TA 👨‍🏫