ややジョーク気味ですが、遅延セグメントツリー を使って文字列内の各区間の大文字・小文字の個数を管理しても解くことができます。(各文字が A, B, …, Z のいずれであるかは素直に更新します。)
実装例 (C++)