# Minimum time required to print given string from a circular container based on given conditions

• Difficulty Level : Easy
• Last Updated : 16 Jun, 2022

Given a circular container consisting of lowercase alphabets from ‘a’ to ‘z’, a pointer pointing initially at alphabet ‘a’, and a string str, the task is to find the minimum time required to print the given string str from the circular container, based on following operations that can be performed on every character:

• Move the pointer one character anti-clockwise or clockwise in one unit time
• Print the character in one unit time, and then move the pointer to the next index of the string

Example:

Input: str = “zcd”
Output: 8
Explanation: The steps are as follows:

• Move the pointer anti-clockwise to ‘z’ in 1 second
• Type the character ‘z’ in 1 second
• Move the pointer clockwise to ‘c’ in 3 seconds
• Type the character ‘c’ in 1 second
• Move the pointer clockwise to ‘d’ in 1 seconds
• Type the character ‘d’ in 1 second.

Input: str =”zjpc”
Output: 34
Explanation: The steps are as follows:

• Move the pointer anti-clockwise to ‘z’ in 1 second
• Type the character ‘z’ in 1 second
• Move the pointer clockwise to ‘j’ in 10 seconds
• Type the character ‘j’ in 1 second
• Move the pointer clockwise to ‘p’ in 6 seconds
• Type the character ‘p’ in 1 second
• Move the pointer anti-clockwise to ‘c’ in 13 seconds.

Approach: Below steps can be followed to solve the given problem:

• Calculate time required to reach character index from current pointer index in both directions:
• clockwise time is calculated by taking absolute difference of both indices
• anti-clockwise time is calculated by subtracting clockwise time from 26
• Minimum of both times obtained in the previous step is added to the answer
• Then to print the character, one unit time is also added to the answer

Finally print the answer obtained as the minimum time required.

Below is the implementation of the above approach:

## C++

 `// C++ implementation for the above approach``#include ``using` `namespace` `std;` `// Function to calculate minimum time to``// print all characters in the string``void` `minTime(string word)``{` `    ``int` `ans = 0;` `    ``// Current element where the``    ``// pointer is pointing``    ``int` `curr = 0;` `    ``for` `(``int` `i = 0; i < word.length(); i++) {` `        ``// Find index of that element``        ``int` `k = word[i] - ``'a'``;` `        ``// Calculate absolute difference``        ``// between pointer index and character``        ``// index as clockwise distance``        ``int` `a = ``abs``(curr - k);` `        ``// Subtract clockwise time from``        ``// 26 to get anti-clockwise time``        ``int` `b = 26 - ``abs``(curr - k);` `        ``// Add minimum of both times to``        ``// the answer``        ``ans += min(a, b);` `        ``// Add one unit time to print``        ``// the character``        ``ans++;` `        ``curr = word[i] - ``'a'``;``    ``}` `    ``// Print the final answer``    ``cout << ans;``}` `// Driver code``int` `main()``{``    ``// Given string word``    ``string str = ``"zjpc"``;` `    ``// Function call``    ``minTime(str);``    ``return` `0;``}`

## Java

 `// Java implementation for the above approach``class` `GFG{` `// Function to calculate minimum time to``// print all characters in the string``static` `void` `minTime(String word)``{` `    ``int` `ans = ``0``;` `    ``// Current element where the``    ``// pointer is pointing``    ``int` `curr = ``0``;` `    ``for` `(``int` `i = ``0``; i < word.length(); i++) {` `        ``// Find index of that element``        ``int` `k = (``int``)word.charAt(i) - ``97``;` `        ``// Calculate absolute difference``        ``// between pointer index and character``        ``// index as clockwise distance``        ``int` `a = Math.abs(curr - k);` `        ``// Subtract clockwise time from``        ``// 26 to get anti-clockwise time``        ``int` `b = ``26` `- Math.abs(curr - k);` `        ``// Add minimum of both times to``        ``// the answer``        ``ans += Math.min(a, b);` `        ``// Add one unit time to print``        ``// the character``        ``ans++;` `        ``curr = (``int``)word.charAt(i) - ``97``;``    ``}` `    ``// Print the final answer``    ``System.out.print(ans);``}` `// Driver code``public` `static` `void` `main(String[] args)``{``  ` `    ``// Given string word``    ``String str = ``"zjpc"``;` `    ``// Function call``    ``minTime(str);``}` `}` `// This code is contributed by AnkThon`

## Python3

 `# Python 3 implementation for the above approach` `# Function to calculate minimum time to``# print all characters in the string``def` `minTime(word):``    ``ans ``=` `0` `    ``# Current element where the``    ``# pointer is pointing``    ``curr ``=` `0` `    ``for` `i ``in` `range``(``len``(word)):``        ``# Find index of that element``        ``k ``=` `ord``(word[i]) ``-` `97` `        ``# Calculate absolute difference``        ``# between pointer index and character``        ``# index as clockwise distance``        ``a ``=` `abs``(curr ``-` `k)` `        ``# Subtract clockwise time from``        ``# 26 to get anti-clockwise time``        ``b ``=` `26` `-` `abs``(curr ``-` `k)` `        ``# Add minimum of both times to``        ``# the answer``        ``ans ``+``=` `min``(a, b)` `        ``# Add one unit time to print``        ``# the character``        ``ans ``+``=` `1` `        ``curr ``=` `ord``(word[i]) ``-` `97` `    ``# Print the final answer``    ``print``(ans)` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``# Given string word``    ``str` `=` `"zjpc"` `    ``# Function call``    ``minTime(``str``)``    ` `    ``# This code is contributed by SURENDRA_GANGWAR.`

## C#

 `// C# implementation for the above approach``using` `System;``using` `System.Collections.Generic;` `class` `GFG{` `// Function to calculate minimum time to``// print all characters in the string``static` `void` `minTime(``string` `word)``{` `    ``int` `ans = 0;` `    ``// Current element where the``    ``// pointer is pointing``    ``int` `curr = 0;` `    ``for` `(``int` `i = 0; i < word.Length; i++) {` `        ``// Find index of that element``        ``int` `k = (``int``)word[i] - 97;` `        ``// Calculate absolute difference``        ``// between pointer index and character``        ``// index as clockwise distance``        ``int` `a = Math.Abs(curr - k);` `        ``// Subtract clockwise time from``        ``// 26 to get anti-clockwise time``        ``int` `b = 26 - Math.Abs(curr - k);` `        ``// Add minimum of both times to``        ``// the answer``        ``ans += Math.Min(a, b);` `        ``// Add one unit time to print``        ``// the character``        ``ans++;` `        ``curr = (``int``)word[i] - 97;``    ``}` `    ``// Print the final answer``    ``Console.Write(ans);``}` `// Driver code``public` `static` `void` `Main()``{``    ``// Given string word``    ``string` `str = ``"zjpc"``;` `    ``// Function call``    ``minTime(str);``}``}` `// This code is contributed by ipg2016107.`

## Javascript

 ``

Output

`34`

Time complexity: O(N), where N is the length of given string str
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up